c#泛型 out 協變和in 逆變


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM