AddRange(IEnumerable) をリストに追加しようとすると、最近問題が発生しました。おそらく古典的な問題ですが、まだよくわかりません。
List パラメーターを期待するメソッドが List に満足していないことは理解しています。なぜなら、List に Base を追加しようとする可能性があるからです。これは明らかに不可能です。
しかし、これが正しく取得できれば、IEnumerables 自体は変更できないため、この場合は機能するはずです。
私が考えたコードは次のようになります。
class Foo
{
}
class Bar : Foo
{
}
class FooCol
{
private List<Foo> m_Foos = new List<Foo> ();
public void AddRange1(IEnumerable<Foo> foos)
{
m_Foos.AddRange (foos); // does work
}
public void AddRange2<T>(IEnumerable<T> foos) where T : Foo
{
m_Foos.AddRange (foos); // does not work
}
}
class Program
{
static void Main(string[] args)
{
FooCol fooCol = new FooCol ();
List<Foo> foos = new List<Foo> ();
List<Bar> bars = new List<Bar> ();
fooCol.AddRange1 (foos); // does work
fooCol.AddRange1 (bars); // does not work
fooCol.AddRange2 (foos); // does work
fooCol.AddRange2 (bars); // does work
}
}
AddRange2 メソッドでヒントをコンパイラに渡そうとしましたが、これは単に問題に移動しました。
私の考え方は間違っていますか?これは言語の制限ですか、それとも仕様によるものですか?
IIRC、Java 1.5でこのような操作のサポートが追加されたので、将来的にC#にも追加されるのではないでしょうか...?