ホームページ > バックエンド開発 > C++ > C# で `List` を `List` にキャストできますか?

C# で `List` を `List` にキャストできますか?

Patricia Arquette
リリース: 2025-01-09 22:32:47
オリジナル
294 人が閲覧しました

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

派生クラスのリストを基本クラスのリストに変換します

共分散とは、派生型が機能を失うことなく基本型を置き換えることができることを意味します。この場合、基本クラス (Animal) と派生クラス (Cat) があり、基本クラスには入力パラメーターとして List を受け入れる仮想メソッド Play が含まれています。

次のコードは変換の問題を示しています:

<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>
ログイン後にコピー

コードをコンパイルすると、次のエラーが発生します: 引数 1: 'System.Collections.Generic.List' から 'System.Collections.Generic.List' に変換できません。

このエラーは、List が書き込み可能なデータ構造であるために発生します。 List から List への変換を許可すると、犬が猫のリストに追加される可能性があり、予期しない動作が発生する可能性があります。

この問題を解決するために、C# 4 では、安全であることがわかっているインターフェイスに対して「汎用共分散」と呼ばれる概念を導入しました。 IEnumerable はそのようなインターフェイスです。 IEnumerable は突然変異を許可しないため、共変的に安全であると考えられます。

List の代わりに IEnumerable を受け入れるように Play メソッドを変更することで、変換の問題を解決できます。

<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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート