1

私はclassT、実装していinterfaceIBarます。

listタイプの変数がありますList<T>

言語の理解を深めるための2つの質問:

  • なぜこれが機能しないのですか?

    var foo = (ICollection <IBar>)list; // fails!

  • それを回避する方法(可能であれば)?

4

1 に答える 1

5

なぜこれが機能しないのですか?:var foo = (ICollection <IBar>)list;

たとえばT = Foo、2番目のクラスがありFoo2 : IBarます。

次に、次のように続行できます。

var foolist = (ICollection <IBar>)list;
foolist.Add(new Foo2());  // compiles, since Foo2 also implements IBar

ワム!にを追加しようとしたため、実行時に型違反が発生しFoo2ましたList<Foo>

これを回避するために、はのサブタイプですが、はのサブタイプでICollection<Foo>はありません。この背後にある理論は、共変性と反変性です。ICollection<IBar>FooIBar

于 2011-09-29T12:17:39.767 に答える