首頁 >後端開發 >C++ >為什麼我不能在C#中分配列表?

為什麼我不能在C#中分配列表?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-02-02 05:16:09202瀏覽

Why Can't I Assign List to List in C#?

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會導致編譯時錯誤。

方差和安全問題

此問題與泛型中的方差概念有關。協變允許在基類型位置使用派生類型,而逆變允許在派生類型位置使用基類型。在上面的示例中,將List賦值給List將被視為協變。

但是,這種賦值會引發安全問題。如果將新的獅子對象添加到animalsList中,則可以將其分配給animalsList2,而沒有任何編譯時檢查,即使這違反了動物列表的類型安全。

C#中的解決方案

使用數組進行運行時檢查: 數組支持運行時引用類型方差,允許將派生類型數組賦值給基類型數組。

C# 4中的安全方差: C# 4引入了對接口和委託的安全方差支持。 Func在T中是協變的,而Action在T中是逆變的。

C# 2中的變通方法: 在C# 2中,可以使用List.ConvertAll創建具有所需類型的新的列表。

結論

C#方差問題突出了在泛型賦值期間保持類型安全的重要性。雖然可以使用數組或運行時檢查來實現不安全方差,但使用接口和委託的安全方差可確保編譯時類型正確性。對於早期版本的C#,可以使用List.ConvertAll作為替代解決方案。

以上是為什麼我不能在C#中分配列表?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn