以下代码无法编译(
然而,这确实做到了:
在c# 4中,协变/逆变委托可以互相赋值,并且可以从协变/逆变方法创建委托,因此
因此,第一个示例(方法组重载分辨率)应该找到唯一适用的方法
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中,协变/逆变委托可以互相赋值,并且可以从协变/逆变方法创建委托,因此
ToString(object)
方法可以用作Converter<T, string>
,因为T
始终可转换为object
。因此,第一个示例(方法组重载分辨率)应该找到唯一适用的方法
string Convert.ToString(object o)
,与方法调用重载分辨率相同。为什么方法组和方法调用重载分辨率会产生不同的结果呢?
T
不起作用,因为它 可能是 值类型。 - thecoop