c# 4.0以后支持的泛型 out-协变与 in-逆变。
对于泛型类型参数,out 关键字指定该类型参数是协变的。 可以在泛型接口和委托中使用out 关键字。
对于泛型类型参数,in关键字指定该类型参数是逆变的。可以在泛型接口和委托中使用in 关键字。
in-通过逆变,可以使用与泛型参数指定的派生类型相比,派生程度更小的类型。这样可以对委托类型和实现变体接口的类进行隐式转换.
out-通过协变,可以使用与泛型参数指定的派生类型相比,派生程度更大的类型。
引用类型支持泛型类型参数中的协变和逆变,但值类型不支持。
在泛型接口或委托中,如果类型形参仅用作方法返回类型,而不用于方法实参,则可声明为协变的。Ref和 out参数不能为变体.
In 关键字的一个列子
interface ICovariant<in A> { }
// Extending contravariant interface. interface IExtContravariant<in A> : IContravariant<A> { } // Implementing contravariant interface. class Sample<A> : IContravariant<A> { public A Name { get; set; } } class Program { static void Test() { IContravariant<Object> iobj = new Sample<Object>() { Name="不知道"}; IContravariant<String> istr = new Sample<String>(); istr = iobj; } }
Vs有可能提示一下错误:错误1变体无效: 类型参数“A”必须为对于“WfmDev.IContravariant<A>.Name”有效的 固定式。“A”为 逆变。C:\Users\hushuangting\Documents\Visual Studio 2012\Projects\WfmDev\WfmDev\LOGINF.cs1533WfmDev
interface ICovariant<out A> { }
// Extending contravariant interface. interface IExtContravariant<out A> : IContravariant<A> { } // Implementing contravariant interface. class Sample<A> : IContravariant<A> { public A Name { get; set; } } class Program { static void Test() { IContravariant<Object> iobj = new Sample<Object>() { Name="不知道"}; IContravariant<String> istr = new Sample<String>(); iobj=istr ; } }
协变提示: 错误1变体无效: 类型参数“A”必须为对于“WfmDev.IContravariant<A>.Name”有效的 固定式。“A”为 协变。C:\Users\hushuangting\Documents\Visual Studio 2012\Projects\WfmDev\WfmDev\LOGINF.cs1534WfmDev
对于泛型的out和in自己现在也是理解的比较模糊,似懂非懂.只能先记下来,后面再继续研究。
在泛型接口或委托中,如果类型形参仅用作方法返回类型,而不用于方法实参,则可声明为协变的。 Ref 和 out 参数不能为变体