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

為什麼我不能將列表分配給C#中的列表?

Susan Sarandon
Susan Sarandon原創
2025-02-01 17:51:12767瀏覽

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

C# 中派生類列表轉換為基類列表的問題

面向對象編程中,派生類繼承基類是很常見的。然而,在處理集合(如列表)時,為什麼不能簡單地使用相同的基類聲明它們,可能會令人困惑。

考慮以下代碼:

<code class="language-csharp">interface A { }

class B : A { }

class C : B { }

class Test
{
    static void Main(string[] args)
    {
        A a = new C(); // 正确
        List<A> listOfA = new List<C>(); // 编译错误
    }
}</code>

這段代碼在嘗試使用 List<C> 聲明 List<A> 時會導致編譯錯誤。雖然可以將派生類 C 的實例賦值給基類變量 a,但集合卻不行。

這種限制的原因在於 C# 初始化列表的方式。創建 List<A> 時,C# 運行時會生成列表的內部數據結構,預期存儲類型為 A 的對象。然而,由於 C 是 A 的派生類,其對象具有額外的成員,佔用比 A 對象更多的內存。因此,將 List<C> 賦值給 List<A> 會導致內存地址錯位,可能導致內存錯誤。

為了解決這個問題並轉換 List<派生类>List<基类>,可以使用以下方法:

1. 顯式轉換:

遍歷列表並顯式地將每個元素轉換為基類:

<code class="language-csharp">List<A> listOfA = new List<C>().ConvertAll(x => (A)x);</code>

2. LINQ:

使用 LINQ 將元素轉換如下:

<code class="language-csharp">List<A> listOfA = new List<C>().Cast<A>().ToList();</code>

這些方法允許安全轉換和內存地址對齊,確保列表的正常運行。

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

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