2010-05-26 12 views
11

Beim Versuch, den folgenden Code in LINQPad zu kompilieren:Warum generische Inferenz in diesem Fall nicht funktioniert?

void Main() 
{ 
    DriveInfo.GetDrives().Select(GetProviderName).Dump(); 
} 

static string GetProviderName(DriveInfo drive) 
{ 
    // some irrelevant WMI code... 
} 

ich die folgende Fehlermeldung erhalten:

Die Art Argumente für die Methode ‚System.Linq.Enumerable.Select (System.Collections.Generic .IEnumerable, System.Func) kann nicht aus der Verwendung abgeleitet werden. Versuchen Sie, die Typargumente explizit anzugeben.

Wenn ich ein Lambda wie d => GetProviderName(d) anstelle einer Methodengruppe verwenden, es funktioniert gut ... Ich bin ziemlich überrascht, weil ich sicher war, dass der Compiler in der Lage sein würde, den Typen aus der Methodengruppe zu schließen. Es gibt keine andere GetProviderName Methode im Bereich, und die Eingabe- und Ausgabearten sind klar definiert, so dass es implizit in eine Func<DriveInfo, string> konvertierbar sein sollte ... sollte es nicht?

Antwort

8

Dies ist eine Einschränkung in dem Compiler, C# 4.0

+0

Ah, ich war fixiert * wusste * hatte ich es vorher oben getan wurde in C# 3.0 ... den Test arbeiten gesehen. Haben Sie einen Referenzlink dazu? –

+0

http://togaroga.com/2009/11/smarter-type-reference-with-c-4/ – SLaks

+0

genau das, was ich gesucht habe ... danke! –

Verwandte Themen