0

次のように2つのクラスがあり、クラスAはクラスBを継承しています。

public class A
{
     public string Title { get; set; }
}

public class B: A
{

}

次に、クラス A の項目のリストを受け取る次のような関数があります。

public static void Get(List<A> values)
{
    // Do something
}

クラス B のアイテムのリストを次のように関数に渡そうとすると、

private function void Test()
{
     var k = new List<B>();
     Get(k);
}

次のエラー メッセージが表示されます

「System.Collections.Generic.List<B>」から「System.Collections.Generic.List<A>」に変換できません

B は A から継承するだけで、A が持っているプロパティを持つので、これはうまくいかないのでしょうか?

私はすでにこれを調べようと何時間も費やしてきましたが、何が間違っているのかを理解することはできませんでした. どうすれば修正できますか?

4

3 に答える 3

5

いいえ、そうすべきではありません。安全でない可能性があります。

class C : A {

}

public static void Get(List<A> values)
{
    values.Add(new C());
}

で呼び出すGetと、 innew List<B>()のインスタンスを挿入することになるため、安全ではありません。CList<B>

ただし、List<T>「読み取り専用」インターフェースであれば安全です。その場合、探しているcovarianceは安全です。代わりに変更List<A>することができIEnumerable<A>、それは機能します。

于 2012-12-22T03:10:07.967 に答える
1

Bどこでも使用Aできますが、List<B>とは共変List<A>ではありません。ただし、.NET 4.0 以降では、代わりにクラスのリストを使用できます。したがって、関数がではなくを受け取るように宣言すると、コードはコンパイルされます。DerivedIEnumerable<Base>IEnumerable<A>List<A>

于 2012-12-22T03:13:33.913 に答える
0

List<B>B は A から継承しますが、それは継承元という意味ではありませんList<A> B オブジェクトを a に入れ、List<A>それをメソッドに渡すだけです。これがポリモーフィズムのすべてです。

  private function void Test()
  {
      var k = new List<A>();
      k.Add(new B());
      k.Add(new B());
      k.Add(new B());
      k.Add(new B());
      k.Add(new B());
      k.Add(new B());
      Get(k);
  }
于 2012-12-22T03:09:24.840 に答える