c# オブジェクト指向プログラミングでは、派生クラスの継承が非常に一般的です。ただし、セット(リストなど)を処理する場合、同じ基本クラスを使用してそれらを宣言することができない理由は混乱している可能性があります。 次のコードを検討してください:
このコードは、
<code class="language-csharp">interface A { } class B : A { } class C : B { } class Test { static void Main(string[] args) { A a = new C(); // 正确 List<A> listOfA = new List<C>(); // 编译错误 } }</code>を使用しようとすると、コンパイルエラーを引き起こします。派生クラスCのインスタンスはベースクラス変数Aに割り当てることができますが、コレクションは良くありません。
この制限の理由は、C#初期化リストの方法にあります。 を作成するとき、C#は実行時にリストの内部データ構造を生成し、ストレージタイプはAのオブジェクトであると予想されます。ただし、CはAの微分クラスであるため、そのオブジェクトには追加のメンバーがあり、オブジェクトよりも多くのメモリを占有します。したがって、に割り当てると、メモリアドレスが脱臼し、メモリエラーが発生する可能性があります。 List<C>
この問題を解決して変更するために、List<A>
として
1。変換の表現:List<A>
List<C>
List<A>
リストを通過し、各要素を基本クラスに明示的に変換する:
List<派生类>
2。linq:List<基类>
linqを使用して、次のように要素を変換します。 これらのメソッドは、安全な変換とメモリアドレスのアライメントを可能にして、リストの通常の操作を確保します。
以上がC#のリストにリストを割り当てることができないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。