C# 泛型差異問題:將List賦值給List
在C#中使用泛型列表時,嘗試將派生類型的列表賦值給基類型的列表可能會遇到方差問題。此問題是運行時類型安全性和編譯時類型安全之間衝突造成的。
問題和代碼示例
考慮以下代碼:
<code class="language-csharp">class Animal { } class Giraffe : Animal { } static void Main(string[] args) { // 数组赋值有效,但是... Animal[] animals = new Giraffe[10]; // 隐式转换失败 List<Animal> animalsList = new List<Giraffe>(); //编译错误 // 显式转换也失败 List<Animal> animalsList2 = (List<Animal>) new List<Giraffe>(); //编译错误 }</code>
在此示例中,由於運行時檢查,將長頸鹿數組賦值給動物數組是有效的。但是,將List
方差和安全問題
此問題與泛型中的方差概念有關。協變允許在基類型位置使用派生類型,而逆變允許在派生類型位置使用基類型。在上面的示例中,將List
但是,這種賦值會引發安全問題。如果將新的獅子對象添加到animalsList中,則可以將其分配給animalsList2,而沒有任何編譯時檢查,即使這違反了動物列表的類型安全。
C#中的解決方案
使用數組進行運行時檢查: 數組支持運行時引用類型方差,允許將派生類型數組賦值給基類型數組。
C# 4中的安全方差:
C# 4引入了對接口和委託的安全方差支持。 Func
C# 2中的變通方法:
在C# 2中,可以使用List
結論
C#方差問題突出了在泛型賦值期間保持類型安全的重要性。雖然可以使用數組或運行時檢查來實現不安全方差,但使用接口和委託的安全方差可確保編譯時類型正確性。對於早期版本的C#,可以使用List
以上是為什麼我不能在C#中分配列表?的詳細內容。更多資訊請關注PHP中文網其他相關文章!