已经有一些关于这种事情的堆栈溢出帖子,但并不完全相同 - 如果这是已经回答的问题,请提前道歉。
为什么这不起作用:
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 中的集合缺乏协方差,还是我只是很傻,没有正确地做到这一点?
谢谢!
艾萨克