派生类型的通用基类

我有以下代码。

class Header where T: IItem { } class HeaderA : Header { } class HeaderB : Header { } interface IItem { } class ItemA : IItem { } class ItemB : IItem { } Header h = new HeaderA(); 

最后一行无法编译。

 Cannot implicitly convert type 'UserQuery.HeaderA' to 'UserQuery.Header' 

HeaderA是Header的子类型,ItemA是IItem的子类型。 为什么它不起作用?

简而言之,您正在尝试使用一种称为协方差的概念,这种概念在.NETgenerics类中不受支持,并且在接口中默认不受支持。

如果要允许类执行此操作,可以使用通用接口上的out contextual关键字在C#3或更高版本中指定它:

 interface IHeader where T : IItem { } class Header: IHeader where T:IItem { } class HeaderA : Header { } class HeaderB : Header { } interface IItem { } class ItemA : IItem { } class ItemB : IItem { } public void Foo() { //now this works; notice the use of the interface instead of the base class. IHeader h = new HeaderA(); } 

通过使用带有关键字的接口,您基本上告诉编译器,接口的使用不必了解generics类型,而不是它满足接口的generics类型声明(或它是一个对象)的约束。 因此,虽然您现在可以将更多派生generics分配给接口类型的变量,但您只能将它们作为接口类型处理,而不是任何派生类型。

对于类定义, out关键字是不可接受的; 你不能强迫Header用法是协变的。