首頁 > 後端開發 > C++ > 如何在 C# 中安全地將'List”轉換為'List”?

如何在 C# 中安全地將'List”轉換為'List”?

Mary-Kate Olsen
發布: 2025-01-09 22:51:46
原創
681 人瀏覽過

How Can I Safely Cast a `List` to a `List` in C#?

安全地將 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' 轉換為 'System.Collections.Generic.List'」。這是因為,儘管 Cat 類別重寫了 Play 方法,但方法參數類型 (List) 保持不變。

為了解決這個問題,您需要了解泛型協變的概念。泛型協變允許您安全地擴展衍生類別重寫中參數的類型。在本例中,您希望將參數類型從 List 擴展到 List

C# 4 引入了對泛型協變的支持,借助於 IEnumerable 及其協變安全的介面。透過在 Animal 類別中將 Play 方法宣告為:

<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 傳遞給該方法,然後使用協變將其安全地轉換為 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 定義且派生類使用IEnumerable 重寫它時,安全地將List 轉換為List。

以上是如何在 C# 中安全地將'List”轉換為'List”?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板