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的意外輸出,因為盒裝intList
objList
在修改後未直接鏈接到Console.WriteLine
inint
>。 objList
保留對int
的引用。 intList
>
以上是為什麼協方差不支持C#中的價值類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!