Possible Duplicate:
Covariance and Contravariance on the same type argument
您可以使用 out
关键字将泛型类型参数声明为协变的:
interface ICovariant<out R>
您可以使用 in
关键字将泛型类型参数声明为逆变:
interface IContravariant<in R>
而且您还可以同时支持不同类型的参数:
interface IVariant<out R, in A>
那么,为什么不能为单个类型参数同时支持这两种方法呢?
So why can't you suport both for a single type parameter?
请记住,如果类型参数是输出安全的,那么接口(interface)只能在类型参数中是协变的,而如果类型参数是输入安全的,则接口(interface)只能在类型参数中是逆变的。
语法 out T
表示 T
是协变类型参数。
语法 in T
表示 T
是逆变类型参数。
由于 T
是协变类型参数,因此根据定义它是输入不安全的。
由于 T
是逆变类型参数,因此根据定义它是输出不安全的。
因此,T
是输入不安全和输出不安全的。
因此,T
在输入位置被禁止,T
在输出位置被禁止。
因此,T
既不能出现在接口(interface)指定的任何方法的输入位置,也不能出现在任何输出位置。
因此,T
根本不能用在接口(interface)上,作为类型参数也毫无意义。因此,语言设计者甚至禁止您在接口(interface)上包含这种标记为协变和逆变的无用类型,以避免丑陋
interface IFoo<in and out T> { }
Foo<T> : IFoo<T> { }
然后:
IFoo<Cat> cat = (IFoo<Animal>)new Foo<Dog>();
(如果您需要阅读输入安全和输出安全,请参阅语言规范的 13.1.3.1。)