將衍生類別清單轉換為基底類別清單
協變是指派生類型可以取代其基底類型而不會遺失任何功能。在本例中,我們有一個基底類別(Animal)和一個衍生類別(Cat),其中基底類別包含一個虛擬方法 Play,它接受 List 作為輸入參數。
以下程式碼示範了轉換問題:
<code class="language-csharp">using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication9 { class Animal { public virtual void Play(List<Animal> animals) { } } class Cat : Animal { public override void Play(List<Animal> animals) { } } class Program { static void Main(string[] args) { Cat cat = new Cat(); cat.Play(new List<Cat>()); } } }</code>
編譯程式碼會導致錯誤:Argument 1: cannot convert from 'System.Collections.Generic.List
出現此錯誤的原因是 List 是一個可寫資料結構。如果我們允許從 List
為了解決此問題,C# 4 引入了一個名為「泛型協變」的概念,用於已知安全的介面。 IEnumerable
將 Play 方法修改為接受 IEnumerable
<code class="language-csharp">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>
透過使用 IEnumerable<T>
介面來取代 List<T>
,我們利用了 C# 的協變特性,避免了型別轉換錯誤,同時確保了程式碼的安全性。 IEnumerable<T>
只允許讀取數據,不允許修改,因此將 List<Cat>
轉換為 IEnumerable<Animal>
是安全的。
以上是我可以在 C# 中將'List”轉換為'List”嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!