C# 4.0中的泛型協變和逆變
C# 4.0 引入了對泛型協變和逆變的支持,這使得泛型類型的賦值更加靈活。在 C# 的早期版本中,嘗試將 List<string>
賦值給 List<object>
會導致編譯器錯誤,儘管 List<string>
可以容納任何可以轉換為字符串的對象。
為了解決這個問題,C# 4.0 允許對輸出變型類型(例如 IEnumerable<T>
)進行協變,對輸入變型類型(例如 Action<T>
)進行逆變。
協變
協變允許將一種類型用作繼承層次結構中另一種類型的替代。例如,List<string>
可以賦值給 List<object>
,因為字符串是對象。這是因為 IEnumerable<T>
被聲明為 IEnumerable<out T>
,表示它只能輸出類型 T 的值。因此,只要 List<string>
只用於讀取值,將其用作 List<object>
就是安全的。
逆變
逆變允許將一種類型用作繼承層次結構中另一種類型的替代。例如,Action<object>
可以賦值給 Action<string>
,因為對象可以接收字符串作為參數。這是因為 Action<T>
被聲明為 Action<in T>
,表示它只能接受類型 T 的值。因此,只要 Action<object>
只用於傳遞值,將其用作 Action<string>
就是安全的。
實現細節
在 C# 4.0 中,方差是使用 CLR 的協變和逆變支持實現的。這使得 C# 4.0 能夠支持方差而不會影響類型安全。
當泛型類型聲明為輸出變型或輸入變型時,編譯器會生成額外的 IL 代碼,以便在運行時檢查類型參數的方差。這確保了協變和逆變僅以安全的方式使用。
以上是C#4.0的通用協方差和違反能力如何增強類型分配靈活性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!