可以用特定的类型化类创建泛型类的子类吗?

本文关键字:创建 泛型类 子类 类型化 | 更新日期: 2023-09-27 18:14:09

我有一个泛型类,它的子类提供了特定的类型。

public abstract class GenericBase<T>
    where T:Interface1
{
}

我子类化泛型与特定的实现:

public class Customer:
    GenericBase<Type1>

(Type1实现Interface1).

我有另一个抽象基类,它有对this的引用:

protected GenericBase<Interface1> genericInstance;

最后,当我试图将genericInstance分配给基类的实例时,它给了我一个编译器错误,说它"不能隐式地将Customer转换为GenericBase"。

base.genericInstance = new Customer(); //Compiler error

我不明白为什么我会得到这个错误,如果CustomerGenericBase<Type1>的子类型,Type1实现Interface1。如果CustomerGenericBase<Type1>的子类,那么它实际上不是GenericBase<Interface1>的一种类型吗?

我想我误解了这里的泛型;是否存在允许这种行为的方法?

可以用特定的类型化类创建泛型类的子类吗?

在c#中,协方差(将派生类型赋值给基类型)不能应用于泛型类。因此,您需要应用一个特别标记为协变的接口,在新的IGenericBase接口上使用out参数修饰符。

protected IGenericBase<Interface1> genericInstance = new Customer();
public interface IGenericBase<out T> {}
public abstract class GenericBase<T> : IGenericBase<T>
    where T:Interface1 {}
public interface Interface1 {}
public class Type1 : Interface1 {}
public class Customer: GenericBase<Type1> {}

c#没有泛型类的协方差,这基本上意味着你不能将具有派生类型参数较多的值赋给具有派生类型参数较少的变量。

如果满足某些条件,也就是说,如果形参类型仅用于协变位置,即作为方法和属性的返回类型,则可用于接口。

有关更多信息,请参阅此文档和其他文档。