C#協變與逆變介面詳解
協變和逆變用來描述介面與其可引用的型別之間的關係。它們控制編譯器如何驗證不同類型變數之間賦值的安全性。
協變
當介面使用<out T>
語法宣告時,即為協變介面。這意味著它可以持有繼承層次結構中T的更高類型參考。因此,協變介面類型的變數可以賦值給更通用類型的變數。例如,IEnumerable<Animal>
可以安全地賦值給IEnumerable<Object>
。
逆變
相反,使用<in T>
語法聲明的介面是逆變介面。它可以持有繼承層次結構中T的較低型別參考。因此,逆變介面類型的變數可以賦值給更具體的類型變數。例如,Action<Animal>
可以賦值給Action<Cat>
。
實際應用
C#程式設計中的協變和逆變有以下優點:
範例
考慮以下範例:
<code class="language-csharp">interface IBibbleOut<out T> { } interface IBibbleIn<in T> { } class Base { } class Descendant : Base { } class Program { static void Main(string[] args) { // 协变示例:派生类引用可以赋值给基类引用。 IBibbleOut<Base> b = GetOutDescendant(); // 逆变示例:基类引用可以赋值给派生类引用。 IBibbleIn<Descendant> d = GetInBase(); } static IBibbleOut<Descendant> GetOutDescendant() => null; static IBibbleIn<Base> GetInBase() => null; }</code>
如果沒有協變和逆變,此範例中的程式碼將由於類型安全性問題而無法編譯。但是,有了這些保護措施,編譯器就可以驗證賦值並允許程式碼安全執行。
以上是協變和逆變如何提高 C# 介面中的型別安全性和靈活性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!