Следующий код не компилируется (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 методов, поэтому метод ToString(object)
может использоваться как Converter<T, string>
, так как T
всегда гарантированно может быть преобразован в object
.
Итак, первый пример (разрешение перегрузки группы методов) должен найти единственный применимый метод string Convert.ToString(object o)
, такой же, как разрешение перегрузки вызова метода. Почему метод метода & вызывает перегрузку вызова метода, создавая разные результаты?
Более конкретно, это не работает для неограниченного 'T', потому что это _might be_ тип значения. – thecoop