首頁 > 後端開發 > C++ > 我可以在 C# 中將'List”轉換為'List”嗎?

我可以在 C# 中將'List”轉換為'List”嗎?

Patricia Arquette
發布: 2025-01-09 22:32:47
原創
293 人瀏覽過

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

將衍生類別清單轉換為基底類別清單

協變是指派生類型可以取代其基底類型而不會遺失任何功能。在本例中,我們有一個基底類別(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' to 'System.Collections.Generic.List'.

出現此錯誤的原因是 List 是一個可寫資料結構。如果我們允許從 List 轉換為 List,則可以將狗加入貓清單中,這可能會導致意外行為。

為了解決此問題,C# 4 引入了一個名為「泛型協變」的概念,用於已知安全的介面。 IEnumerable 就是這樣一個介面。由於 IEnumerable 不允許變異,因此它被認為是協變安全的。

將 Play 方法修改為接受 IEnumerable 而不是 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<T> 介面來取代 List<T>,我們利用了 C# 的協變特性,避免了型別轉換錯誤,同時確保了程式碼的安全性。 IEnumerable<T> 只允許讀取數據,不允許修改,因此將 List<Cat> 轉換為 IEnumerable<Animal> 是安全的。

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

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