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 參數不能為變體