2014-06-14 2 views
6

Ich definiere ein Lambda und rufe es auf, indem ich "()" sofort anhefte.Definieren Sie eine Lambda-Funktion und führen Sie sie sofort aus

Versuchen:

int i = (() => 0)(); 

Fehler:

Error CS0119: Expression denotes a anonymous method', where a method group' was expected

Warum ist das so?

+0

Aber das funktioniert 'int i = ((Func ) (() => 0))();' –

+0

Verlasse nie zu Hause ohne diese Hilfsmethoden https: // gist.github.com/mausch/758f1bc7a6d6877229a2 –

Antwort

11

Sie sind nicht "definiert ein Lambda" .. Sie sind in Klammern, was Sie denken, ist eins.

Der Compiler leitet diese Art von Sache nicht ab. Es braucht Kontext. Sie übergeben den Kontext, indem Sie die Repräsentation des Lambda einem Delegattyp zuweisen oder zuweisen:

Das ist klarer Kontext. Wenn du einen unklaren willst .. funktioniert auch so etwas:

int i = ((Func<int>)(() => 0))(); 
+0

danke! Das macht Sinn. Ich habe mich daran gewöhnt, in Scala zu schreiben –

+0

Gibt es in C# noch weitere Beispiele? –

+0

Beispiele für ...? –

7

Ein Lambda unterstützt einfach nicht ausgeführt zu werden. Ein Delegat unterstützt die Ausführung. Ein Lambda-Ausdruck kann implizit in einen Delegattyp konvertiert werden. Falls keine solche Konvertierung angefordert wird, gibt es keinen Delegattyp "Standard". Seit .NET 2 verwenden wir normalerweise Action und Func für alles, aber wir könnten verschiedene Delegattypen verwenden.

Erste, der einen Delegaten konvertieren, dann ausführen:

((Func<int>)(() => 0))() 

Man könnte, dass C# argumentieren zu verwenden Action und Func wenn nichts anderes beantragt wurde in Verzug. Die Sprache tut dies ab C# 5 nicht.

Verwandte Themen