在 C# 中將衍生類別清單轉換為基底類別清單
此範例示範了一個常見問題:將衍生類別物件清單(例如 List<Cat>
)傳遞給需要基底類別物件清單(List<Animal>
)的方法。 不允許直接賦值,因為基底類別參考不能直接指向派生類別物件。
問題:
嘗試將 List<Cat>
傳遞給帶有 List<Animal>
參數的方法會導致編譯器錯誤。
解:使用 IEnumerable
和協方差
此解利用了 C# 的通用協方差。 不要使用 List<Animal>
,而是將方法參數類型變更為 IEnumerable<Animal>
。 IEnumerable
是唯讀介面;這可以防止該方法修改原始集合,從而解決潛在的類型安全問題。
修改後的程式碼:
<code class="language-csharp">class Animal { public virtual void Play(IEnumerable<Animal> animals) { } } class Cat : Animal { public override void Play(IEnumerable<Animal> animals) { //Implementation } } class Program { static void Main() { Cat myCat = new Cat(); myCat.Play(new List<Cat>()); // This now compiles successfully } }</code>
這是有效的,因為 List<Cat>
隱式轉換為 IEnumerable<Cat>
,並且 IEnumerable<Cat>
與 IEnumerable<Animal>
協變。 Play
方法現在可以安全地迭代集合,而無需嘗試修改它。 這種方法保持類型安全,同時允許靈活的方法參數化。
以上是如何在 C# 中將清單轉換為清單?的詳細內容。更多資訊請關注PHP中文網其他相關文章!