Nehmen wir ein vereinfachtes Beispiel:
%Vor%Compiler sagt:
Der Typ 'System.Collections.Generic.IEnumerable' kann nicht als Typparameter 'C' im generischen Typ oder in der Methode 'UserQuery.Foo (C, T)' verwendet werden. Es gibt keine implizite Referenzkonvertierung von 'System.Collections.Generic.IEnumerable' zu 'System.Collections.Generic.ICollection'.
Wenn ich Main
zu:
Es wird gut funktionieren. Warum wählt der Compiler nicht die richtige Überladung?
Ihre Frage wird hier beantwortet.
Bitte lesen Sie auch die ungefähr eine Million Kommentare, die mir sagen, dass ich falsch liege, wenn ich einen interessanten zusätzlichen Kommentar zu diesem Thema anführe.
Ich vermute, dass der Compiler die beste Übereinstimmung wählt, bevor er die generische Einschränkung verwendet. In Ihrem Beispiel ist die Methode mit der Einschränkung vorzuziehen, da sie keinen Parameter params
last hat.
Bearbeiten - Eric Lippert bestätigt dies in seiner Antwort.
Tags und Links c# generics overloading constraints c#-3.0