0

Circleオブジェクトの配列があります(CircleはIShapeインターフェイスを実装し、パラメーターが..の関数を持っています。CirclesのList<IShape>配列をこれに渡せないのはなぜですか?

Visual Studioで、に変換できないというビルドエラーが発生しList<Circle>ますList<IShape>

4

1 に答える 1

5

簡単に言うと、関数は次のFooように実装できるためです。

void Foo(IList<IShape> c)
{
    c.Add(new Square());
}

にを渡した場合、型シグネチャが問題ないと主張していてもList<Circle>Foo提供された型はを格納できません。共変ではありません:任意の形状の追加をサポートできないため、一般的なものはできません。SquareIList<T>IList<Circle>IList<IShape>

修正は、のIEnumerable<IShape>引数を受け入れるために使用することFooですが、すべての場合に機能するとは限りません。IEnumerable<T>共変である:専門家IEnumerable<Circle>は一般の契約に適合しIEnumerable<IShape>ます。


この振る舞いも良いことです。あるべきではないのに共変であるものの典型的な例は配列です。次のコードはコンパイルされますが、実行時に失敗します。

void Bar()
{
    // legal in C#:
    object[] o = new string[10];
    // fails with ArrayTypeMismatchException: can't store Int in a String[]
    o[0] = 10;
}
于 2013-03-22T02:52:16.643 に答える