この種のことについてはすでにスタックオーバーフローにいくつかの投稿がありますが、まったく同じではありません-したがって、これがすでに回答されているものである場合は、事前にお詫び申し上げます。
なぜこれが機能しないのですか?
public class MyBase { }
public class MyUtils
{
public bool Foo<T> (T myObject) { return true; }
public bool Foo (MyBase myBaseObject) { return false; }
public void Go<T> (IEnumerable<T> items)
{
foreach (var item in items)
{
// this test fails
Assert.IsFalse (Foo (item));
}
}
}
上記のGo()を呼び出して、MyBaseオブジェクトのロードを渡すと、Fooを呼び出すたびに汎用のFoo()が呼び出され、trueが返されます。
new MyUtils ().Go (new MyBase[] { new MyBase (), new MyBase () });
代わりに、専用のMyBaseバージョンを呼び出さないのはなぜですか?Foo(new MyBase())を直接呼び出すと、どの呼び出しを行うかが正しく推測されます。これは、C#3のコレクションの共分散が不足しているためですか、それとも私は愚かでこれを正しく行っていないのですか?
ありがとう!
アイザック