.NET泛型中的協變與逆變
型別引數可由關鍵字“In”和“Out”修飾。“In”型別只能作為方法引數。與此類似,“Out”型別只能作為方法的返回型別。
使用Out型別的一個例子就是IEnumerable(Of T)。如果某函式接受一個IEnumerable(Of Animal)型別引數,那麼我們就可以給它傳一個IEnumerable(of Bird)。對於In型別,一個不太恰當的例子就是順序。看一下下面的介面:
Interface IWriter(Of T) Write(value As T)
如果你向接受Writer(Of Animal)型別引數的函式傳一個IWriter(Of Bird),當然就不對了。該方法可以將Animal的任何子類傳給IWriter.Write,但是它只接受Birds。
如果使用註解,該介面看起來像下面這樣:
Interface IEnumerable(Of Out T)Interface IWriter(Of In T)
這是針對VB編寫的,它也可以用在C#上。
interface IEnumerableinterface IWriter
不幸的是,這種語法並不能直接應用在大多數常見的場景中。比如IList(Of T),當傳給一個向集合中寫入的方法時,T應該是In型別。但是當傳給一個從集合中讀取的方法時,T應該是Out型別。或許這裡應該針對IList建立一個基類,該類會將接受T與返回T的方法區分開來。
追溯過去,C#和VB都支援陣列協變(out/IEnumerable情況),儘管在逆變的情況下這會導致執行時錯誤(in/IWriter情況)。這樣做的目的是使C#更相容於Java。大多數人都認為這是一個不好的設計,但是現在卻無法改變了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-541454/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C# 泛型的協變和逆變C#泛型
- C#泛型的逆變協變(個人理解)C#泛型
- .NET Core CSharp初級篇 1-8泛型、逆變與協變CSharp泛型
- Java中的逆變與協變Java
- 泛型協變與抗變(二)泛型
- Java 中泛型的協變Java泛型
- 泛型、陣列列表與協變泛型陣列
- .NET C#雜談(1):變體 - 協變、逆變與不變C#
- C#中的協變和逆變C#
- iOS-關鍵字-泛型ObjectType 協變__covariant 逆變__contravariantiOS泛型Object
- java協變逆變,PECSJava
- C#深入學習:泛型修飾符in,out、逆變委託型別和協變委託型別C#泛型型別
- 瞭解C#的協變和逆變C#
- 詳解C#的協變和逆變C#
- 你瞭解C#的協變和逆變嗎C#
- 【C#開發】C#的協變和逆變C#
- 教你如何攻克Kotlin中泛型型變的難點(上篇)Kotlin泛型
- 教你如何攻克Kotlin中泛型型變的難點(下篇)Kotlin泛型
- 重學c#系列——逆變和協變[二十四]C#
- java 之泛型與可變引數詳解Java泛型
- NET 2.0中泛型泛型
- 教你如何攻克Kotlin中泛型型變的難點(實踐篇)Kotlin泛型
- 【OpenCV-Python】:影像的傅立葉變換與逆傅立葉變換OpenCVPython
- 介面的實現方式(顯示和隱示)及協變和逆變
- 【java】【泛型】泛型geneticJava泛型
- C#基礎筆記——協變(Covariance)和逆變(Contravariance)C#筆記
- c++中的變數型別_C ++中的變數C++變數型別
- 泛型型別(.NET 指南)泛型型別
- IP協議的發展與演變協議
- @property中的變數與_變數
- C++中變數的型別C++變數型別
- Java中的泛型Java泛型
- .NET泛型解析(上)泛型
- .NET泛型解析(下)泛型
- .net entity framework 泛型 更新與增加記錄Framework泛型
- iOS9中HTTP協議的變化iOSHTTP協議
- 翻譯 | Java 中的變型(Variance)Java
- c++中變數型別C++變數型別