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

如何在 C# 中安全地將清單轉換為清單?

Susan Sarandon
發布: 2025-01-09 22:36:42
原創
283 人瀏覽過

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

C# 中將 List 轉換為 List

在處理繼承時,有時需要將衍生類別物件的清單轉換為基底類別物件的清單。但是,如果處理不當,這可能會導致錯誤。

使用可寫入資料進行清單轉換的錯誤

考慮以下程式碼:

<code class="language-c#">using System;
using System.Collections.Generic;

class Animal
{
    public virtual void Play(List<Animal> animal) { }
}

class Cat : Animal
{
    public override void Play(List<Animal> animal) { }
}

class Program
{
    static void Main(string[] args)
    {
        Cat cat = new Cat();
        cat.Play(new List<Cat>());
    }
}</code>
登入後複製

這段程式碼會因為列表物件類型不符而產生編譯錯誤。 Animal 期望一個其自身類型的清單 (Animal),而該方法卻使用 Cat 物件的清單進行呼叫。

錯誤原因

發生此錯誤的原因是清單是可寫的。如果允許轉換,則可能導致資料操作問題。例如,可以將狗物件新增到貓的清單中,這將違反類型安全。

泛型協變

在 C# 4 中,引進了名為泛型協變的功能。這允許將衍生類別的列表轉換為基底類別的列表,前提是這些類型確保類型安全。一個泛型協變的安全型別範例是 IEnumerable<T>,它表示物件的序列,但無法寫入。

實現泛型協變

要實現泛型協變,可以將基底類別中的方法簽章變更為使用 IEnumerable<T> 作為參數類型,如下所示:

<code class="language-c#">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>
登入後複製

在此範例中,Animal 中的 Play 方法採用 IEnumerable<Animal> 作為參數,這允許它接受 Animal 和 Cat 物件的序列。

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

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