Lassen Sie uns einen folgenden vereinfachten Beispiel haben:C# überladen mit Generics: Fehler oder Feature?
void Foo<T>(IEnumerable<T> collection, params T[] items)
{
// ...
}
void Foo<C, T>(C collection, T item)
where C : ICollection<T>
{
// ...
}
void Main()
{
Foo((IEnumerable<int>)new[] { 1 }, 2);
}
Compiler sagt:
Der Typ 'System.Collections.Generic.IEnumerable' nicht als Typ-Parameter 'C' in der generischen Art verwendet werden können, oder Methode 'UserQuery.Foo (C, T)'. Es gibt keine implizite Referenzkonvertierung von 'System.Collections.Generic.IEnumerable' zu 'System.Collections.Generic.ICollection'.
Wenn ich Main
zu ändern:
void Main()
{
Foo<int>((IEnumerable<int>)new[] { 1 }, 2);
}
wird es ok arbeiten. Warum Compiler wählt nicht die richtige Überlastung?
gibt es wirklich keine Konvertierung zwischen IEnumerable und ICollection. – nothrow
@Yossarian: zwei Dinge. Erstens gibt es eine explizite Konvertierung. Sie wollen sagen "es gibt wirklich keine implizite Referenzkonvertierung". Zweitens ist die Frage nicht "Warum bekomme ich einen Fehler" keine implizite Umwandlung "?" Zweitens stellt sich die Frage, "warum wählt der Überladungsauflösungsalgorithmus einen Kandidaten mit exakter Übereinstimmung aus, der ungültig ist, anstatt den gültigen, aber schlechteren Kandidaten auszuwählen, der nicht genau übereinstimmt?" –