2008-11-06 3 views
5

So merkwürdige Situation, die ich in heute lief mit SortiertNach:C# 3.0 Func/SortiertNach Typinferenz

Func<SomeClass, int> orderByNumber = 
    currentClass => 
    currentClass.SomeNumber; 

Dann:

someCollection.OrderBy(orderByNumber); 

Das ist in Ordnung, aber ich wollte eine Methode anstatt erstellen weil es woanders als ein orderBy verwendbar sein könnte.

private int ReturnNumber(SomeClass currentClass) 
{ 
    return currentClass.SomeNumber; 
} 

Jetzt, wenn ich versuche, dass in die SortiertNach zu stopfen:

someCollection.OrderBy(ReturnNumber); 

Es kann den Typen nicht ableiten, wie er kann, wenn ich eine Func verwenden. Scheint mir ähnlich, sie sollten gleich sein, da die Methode selbst "stark typisiert" ist wie der Func.

Seite Anmerkung: Ich weiß, ich kann dies tun:

Func<SomeClass, int> orderByNumber = ReturnNumber; 

Antwort

8

Dies galt auch für "return-type type inference" not working on Method Groups zusammenhängen könnte.

Im Wesentlichen, in Fällen (wie Where 's Prädikat) wo die generischen Parameter nur in Eingabepositionen sind, funktioniert die Methodengruppenumwandlung gut. Aber in Fällen, in denen der generische Parameter ein Rückgabetyp ist (wie Select oder OrderBy Projektionen), wird der Compiler nicht die entsprechende Delegate Konvertierung ableiten.

8

ReturnNumber ist nicht ein Verfahren - stattdessen stellt sie eine Methodengruppe alle Methoden mit dem Namen ReturnNumber aber mit möglicherweise unterschiedlichen arity-und-Typ Signaturen enthalten. Es gibt einige technische Probleme, herauszufinden, welche Methode in dieser Methodengruppe wirklich sehr allgemein gewünscht ist und zu jeder Zeit funktioniert. Offensichtlich könnte der Compiler herausfinden, einige, sogar die meisten, der Zeit, aber eine Entscheidung wurde gemacht, dass das Setzen eines Algorithmus in den Compiler, der nur die Hälfte der Zeit arbeiten würde, eine schlechte Idee war.

Folgende Arbeiten jedoch:

someCollection.OrderBy(new Func<SomeClass, int>(ReturnNumber)) 
+0

Methodengruppe ist etwas, was ich nicht dachte. Ich wünschte, ich könnte zwei Antworten markieren. –