Il seguente codice non compila (error CS0123: No overload for 'System.Convert.ToString(object)' matches delegate 'System.Converter<T,string>'
):In che modo la risoluzione di sovraccarico del gruppo metodo è diversa dalla risoluzione di sovraccarico chiamata metodo?
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;
}
}
Tuttavia, questo:
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);
}
}
In C# 4, delegati co/contra-variante può essere assegnato a vicenda, e i delegati possono essere creati da metodi co/contra-variant, quindi il metodo ToString(object)
può essere utilizzato come Converter<T, string>
, poiché T
è sempre garantito per essere convertito in un object
.
Quindi, il primo esempio (risoluzione di sovraccarico del gruppo metodo) dovrebbe trovare l'unico metodo applicabile string Convert.ToString(object o)
, lo stesso della risoluzione di sovraccarico chiamata metodo. Perché il metodo metodo & metodo di risoluzione di sovraccarico chiamata produce risultati diversi?
Più precisamente, si tratta di non lavorare per un non vincolato 'T' perché _might be_ un tipo di valore. – thecoop