安全地將 C# 中的 List 轉換為 List
在 C# 中,處理繼承和泛型類型時,您可能會遇到需要將衍生類別物件的清單轉換為基底類別物件的清單的情況。如果基底類別包含在衍生類別中被重寫的虛擬方法,這可能會導致問題。
考慮以下範例:
<code class="language-csharp">class Animal { public virtual void Play(List<Animal> animals) { } } class Cat : Animal { public override void Play(List<Animal> animals) { // Cat 特定的实现 } } class Program { static void Main(string[] args) { Cat cat = new Cat(); cat.Play(new List<Cat>()); // 错误:参数 1 无法从“System.Collections.Generic.List<Cat>”转换为“System.Collections.Generic.List<Animal>” } }</code>
編譯此程式碼時,您將遇到錯誤訊息「參數 1:無法從 'System.Collections.Generic.List
為了解決這個問題,您需要了解泛型協變的概念。泛型協變允許您安全地擴展衍生類別重寫中參數的類型。在本例中,您希望將參數類型從 List
C# 4 引入了對泛型協變的支持,借助於 IEnumerable
<code class="language-csharp">public virtual void Play(IEnumerable<Animal> animals) { }</code>
然後在 Cat 類別中重寫它:
<code class="language-csharp">public override void Play(IEnumerable<Animal> animals) { }</code>
您可以讓 Play 方法協變安全。這允許您將 List
<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 定義且派生類使用IEnumerable 重寫它時,安全地將List 轉換為List。
以上是如何在 C# 中安全地將'List”轉換為'List”?的詳細內容。更多資訊請關注PHP中文網其他相關文章!