關於這種事情,已經有一些帖子已經對堆棧溢出了,但並不完全一樣 - 如果事先已經得到回答,請事先道歉。通過IEnumerable進行的推斷類型<T>
爲什麼這個不行:
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));
}
}
}
如果我致電上述圍棋(),並通過在MyBase對象的負荷,每次調用美孚將調用通用美孚(),它返回true。
new MyUtils().Go (new MyBase[] { new MyBase(), new MyBase() });
爲什麼它不調用專門的MyBase版本呢?如果我直接調用Foo(new MyBase()),它會正確地推斷出要調用哪個。這是因爲C#3中的集合缺乏協變性,還是我只是很傻而且沒有正確地做到這一點?
謝謝!
艾薩克
重載解析是在編譯時完成的,並且在編譯時,每個'item'都是T類型的,它不知道它們中的任何一個都是特定的MyBase。 – meandmycode 2009-12-03 13:43:35
@meandmycode - 你應該將其作爲回答(鏈接http://msdn.microsoft.com/en-us/library/aa691336%28VS.71%29.aspx) – 2009-12-03 14:00:32
謝謝你。難道它在編譯時不知道它是MyBase類型的,因爲我傳入的集合被輸入到MyBase中? – 2009-12-04 15:26:44