C# 中將 List 轉換為 List
在處理繼承時,有時需要將衍生類別物件的清單轉換為基底類別物件的清單。但是,如果處理不當,這可能會導致錯誤。
使用可寫入資料進行清單轉換的錯誤
考慮以下程式碼:
<code class="language-c#">using System; using System.Collections.Generic; class Animal { public virtual void Play(List<Animal> animal) { } } class Cat : Animal { public override void Play(List<Animal> animal) { } } class Program { static void Main(string[] args) { Cat cat = new Cat(); cat.Play(new List<Cat>()); } }</code>
這段程式碼會因為列表物件類型不符而產生編譯錯誤。 Animal 期望一個其自身類型的清單 (Animal),而該方法卻使用 Cat 物件的清單進行呼叫。
錯誤原因
發生此錯誤的原因是清單是可寫的。如果允許轉換,則可能導致資料操作問題。例如,可以將狗物件新增到貓的清單中,這將違反類型安全。
泛型協變
在 C# 4 中,引進了名為泛型協變的功能。這允許將衍生類別的列表轉換為基底類別的列表,前提是這些類型確保類型安全。一個泛型協變的安全型別範例是 IEnumerable<T>
,它表示物件的序列,但無法寫入。
實現泛型協變
要實現泛型協變,可以將基底類別中的方法簽章變更為使用 IEnumerable<T>
作為參數類型,如下所示:
<code class="language-c#">class Animal { public virtual void Play(IEnumerable<Animal> animals) { } } class Cat : Animal { public override void Play(IEnumerable<Animal> animals) { } } class Program { static void Main() { Cat cat = new Cat(); cat.Play(new List<Cat>()); } }</code>
在此範例中,Animal 中的 Play 方法採用 IEnumerable<Animal>
作為參數,這允許它接受 Animal 和 Cat 物件的序列。
以上是如何在 C# 中安全地將清單轉換為清單?的詳細內容。更多資訊請關注PHP中文網其他相關文章!