C#中的協變與逆變介面
C#中的協變和逆變介面在處理類型及其繼承層次結構時提供了更大的彈性。
協變介面 (out T)
協變介面指定泛型型別參數可以在繼承層次結構中被視為較高層級的型別。對於宣告為interface IBibble<out T>
的接口,您可以將接口引用視為表示派生自T的型別。
逆變介面 (in T)
逆變介面允許將泛型類型參數視為繼承層次結構中較低層級的類型。當介面定義為interface IBibble<in T>
時,介面引用可以視為表示T的基底類型的類型。
協變的實際應用
協變允許您將派生類型的集合視為基底類型的集合。例如,考慮一個動物列表,每個動物都有一個名稱。您可以安全地檢索所有動物的名稱,因為所有動物都有名稱。
逆變的實際應用
逆變允許將派生類型新增至基底類型的集合。例如,如果您能夠訪問動物集合並且需要向其中添加魚,您可以這樣做,因為所有魚都是動物。但是,嘗試從集合中檢索魚是不允許的,因為不能保證集合只包含魚。
輸入輸出位置
在C# 4.0中,in
和out
關鍵字明確地將介面標記為協變或逆變。 in
指定輸入位置(方法參數,只寫屬性),而out
指示輸出位置(方法傳回值,只讀屬性,out
方法參數)。
範例
以下範例示範了協變和逆變:
<code class="language-csharp">interface IBibbleOut<out T> { } interface IBibbleIn<in T> { } class Program { static void Main(string[] args) { var b = GetOutDescendant(); // b只能保存Descendant对象 var d = GetInBase(); // d可以接收Base和Descendant对象 } static IBibbleOut<Descendant> GetOutDescendant() { return null; } static IBibbleIn<Base> GetInBase() { return null; } } class Base { } class Descendant : Base { }</code>
如果沒有協變和逆變,編譯器將無法保證範例程式碼中的類型安全,這可能會導致錯誤。
以上是協變和逆變如何增強 C# 介面中的型別安全性和靈活性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!