【发布时间】:2010-06-14 11:10:21
【问题描述】:
以下代码无法编译 (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/contra-variant delegate可以相互赋值,并且可以从co/contra-variant方法创建delegate,所以ToString(object)方法可以作为Converter<T, string>,作为@ 987654326@ 始终保证可转换为object。
因此,第一个示例(方法组重载解析)应该是找到唯一适用的方法string Convert.ToString(object o),与方法调用重载解析相同。为什么方法组和方法调用重载解析会产生不同的结果?
【问题讨论】:
标签: c# .net-4.0 covariance overloading