我有一个带有子类的泛型类,它提供了特定的类型。
public abstract class GenericBase<T>
where T:Interface1
{
}
我将泛型与特定实现子类化:
public class Customer:
GenericBase<Type1>
(Type1
实施Interface1
)。
我有另一个抽象基类,它引用了这个:
protected GenericBase<Interface1> genericInstance;
最后,当我尝试将genericInstance分配给基类的实例时,它会给我一个编译错误,说它“无法隐式地将Customer转换为GenericBase&lt; Interface1&gt;”。
base.genericInstance = new Customer(); //Compiler error
我不明白为什么如果Customer
是GenericBase<Type1>
的子类型,而Type1
实现Interface1
,我会收到此错误。 Customer
是GenericBase<Interface1>
的有效类型,如果它是GenericBase<Type1>
的子类吗?
我认为我在这里误解了一些关于泛型的东西;有没有办法允许这种行为?
答案 0 :(得分:10)
在C#中,协方差(将派生类型分配给基本类型)不能应用于泛型类。因此,您需要在新的IGenericBase
界面上使用out parameter modifier应用专门标记为协变的接口。
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> {}
答案 1 :(得分:4)
C#没有泛型类的协方差,这基本上意味着你不能将具有更多派生类型参数的值赋值给具有较少派生类型参数的变量。
这可以用于接口,但是,如果满足一些条件,即参数类型仅用于协变位置,即作为方法和属性的返回类型。
有关详细信息,请参阅this和其他文档。