下面的代碼不編譯(error CS0123: No overload for 'System.Convert.ToString(object)' matches delegate 'System.Converter<T,string>'
):方法組重載解析如何與方法調用重載解析不同?
class A<T> {
void Method(T obj) {
Converter<T, string> toString = Convert.ToString;
// this doesn't work either (on .NET 4):
Converter<object, string> toString2 = Convert.ToString;
Converter<T, string> toString3 = toString2;
}
}
然而,這並不:
class A<T> {
void Method(T obj) {
// o is a T, and Convert.ToString(o) is using
// string Convert.ToString(object o)
Converter<T, string> toString = o => Convert.ToString(o);
}
}
在C#4,CO /雙重變體代表可以被分配到彼此,和代表可以通過co/contra-variant方法創建,因此ToString(object)
方法可用作Converter<T, string>
,因爲T
始終可保證可轉換爲object
。
因此,第一個示例(方法組重載決議)應該找到唯一適用的方法string Convert.ToString(object o)
,與方法調用重載解析相同。爲什麼方法組&方法調用重載分辨率產生不同的結果?
更具體地說,它不適用於無約束的'T',因爲它可能是值類型。 – thecoop 2010-06-26 09:28:51