首頁 >後端開發 >C++ >為什麼協方差不支持C#中的價值類型?

為什麼協方差不支持C#中的價值類型?

Barbara Streisand
Barbara Streisand原創
2025-01-30 21:26:13785瀏覽

Why Doesn't Covariance Support Value Types in C#?

c#協方差和值類型限制

> C#中的協方差允許將派生的接口類型分配給其基本接口類型。 這使得將派生類型的對象視為基本類型的對象。 但是,此功能有意限制對價值類型。

拳擊和身份的作用>

>此限制的核心原因是拳擊過程。 當將值類型分配到接口變量時,它是盒裝的,將其轉換為堆上的參考類型。這會創建一個新的

對象,以更改原始值的身份。 已經居住在堆上的參考類型,不要經歷這種改變身份的拳擊。 > 維持身份對於協方差至關重要。 如果允許價值類型的協方差,則修改基本類型集合中的派生類型對象可能會導致意外的行為和身份不一致。

說明性示例

以下代碼片段演示了問題:

雖然(假設)協方差引起的初始分配起作用,但修改

>出乎意料地改變了
<code class="language-csharp">IEnumerable<int> intList = new List<int>();
IEnumerable<object> objList = intList; // Covariance (if allowed for value types)

intList.Add(10);
Console.WriteLine(((List<int>)objList)[0]); // Output: 10
intList[0] = 20;
Console.WriteLine(((List<int>)objList)[0]); // Output: 0  (Unexpected!)</code>
中的盒裝值,突出顯示了防止C#中價值類型的協方差支持的身份問題。 第二個

顯示了0的意外輸出,因為盒裝intListobjList在修改後未直接鏈接到Console.WriteLineinint>。 objList保留對 boxedint的引用。 intList>

以上是為什麼協方差不支持C#中的價值類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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