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中文網其他相關文章!