ホームページ >バックエンド開発 >C++ >派生クラスオブジェクトのリストをC#のベースクラスリストに割り当てることはできますか?

派生クラスオブジェクトのリストをC#のベースクラスリストに割り当てることはできますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-02-02 05:31:08672ブラウズ

Can I Assign a List of Derived Class Objects to a Base Class List in C#?

c# C#プログラミング言語では、ベースクラスの参照リストに派生したクラスオブジェクトのリストがコラボレーションの問題を引き起こします。この問題は、基本クラスに派生カテゴリが存在しない場合に発生します。 たとえば、

次のコードを検討してください

このコードでは、キリンオブジェクトのリストが動物が参照するリストに割り当てられます。ただし、この割り当ては、調整の問題により、編集中に失敗しました。

協力と非自発性
<code class="language-csharp">class Animal { }
class Giraffe : Animal { }

static void Main(string[] args)
{
    List<Giraffe> giraffes = new List<Giraffe>();
    List<Animal> animals = giraffes; // 编译时错误
}</code>

C#の一般的なタイプは、調整または変更できません。調整により、基本クラスの参照が派生クラスオブジェクトを参照することができますが、非債務はそのような割り当てを防ぎます。リストの場合、デフォルトの動作は非自発性です。つまり、リスト

をリストに割り当てることはできません。

solution

この問題を解決するために、いくつかの解決策があります:

明示的な変換:次のコードを使用して、リスト

を表示することができます。
  • ただし、この明示的な変換を使用することはお勧めしません。これは、変換が無効である場合、ランタイムエラーを引き起こす可能性があるためです。 Convertall Method:リストにリスト
に変換できます。たとえば、
<code class="language-csharp">List<Animal> animals = (List<Animal>)giraffes; // 不推荐,可能导致运行时错误</code>

  • icovariantインターフェイスを実装 カスタムインターフェイスを介して一般的なタイプの共同変更を指定するために明示的に指定できます。 ICOVARIANTインターフェイスを実装することにより、クラスはオブジェクトがジェネリックタイプの遺伝クラスを使用して割り当てを参照できるようにすることができます。 (注:
  • はc#には存在しません。実際の解決策は、
を使用することです。
<code class="language-csharp">List<Animal> animals = giraffes.ConvertAll(g => (Animal)g);</code>
自体が調整をサポートしていないためです。)変更。
  • 選択する方法は、特定の状況とコードの堅牢性の要件に依存します。 メソッドは通常、より安全で、変換の意図を表現するため、最初の選択です。 の使用は、一般的なプログラミングの原則に沿ったものであり、明示的な変換のリスクを回避します。

以上が派生クラスオブジェクトのリストをC#のベースクラスリストに割り当てることはできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。