2010-01-02 7 views
9

Ich habe ein Delegierter in meinem Code definiert:Schreibe eine Lambda oder anonyme Funktion, die einen out-Parameter akzeptiert

public bool delegate CutoffDateDelegate(out DateTime cutoffDate); 

Ich möchte Delegierten schaffen und mit einem Lambda-oder anonyme Funktion initialisieren, aber keiner von ihnen zusammengestellt .

CutoffDateDelegate del1 = dt => { dt = DateTime.Now; return true; } 
CutoffDateDelegate del2 = delegate(out dt) { dt = DateTime.Now; return true; } 

Gibt es eine Möglichkeit, dies zu tun?

+2

Erkennen diese Art von alt ist, aber ich glaube nicht, dass es ein Duplikat ist. Bei der verknüpften Frage geht es darum, den out-Parameter der parent (?) -Funktion in der anonymen Funktion zu verwenden, während in diesem Fall eine anonyme Funktion deklariert wird, die ihren eigenen out-Parameter hat. – Salvador

Antwort

18

Sie können entweder Lambda oder anonymen Delegaten Syntax verwenden - Sie müssen nur den Typ des Arguments angeben, und es wie aus markieren:

public delegate bool CutoffDateDelegate(out DateTime cutoffDate); 

// using lambda syntax: 
CutoffDateDelegate d1 = 
    (out DateTime dt) => { dt = DateTime.Now; return true; }; 

// using anonymous delegate syntax: 
CutoffDateDelegate d2 = 
    delegate(out DateTime dt) { dt = DateTime.Now; return true; } 

Während ausdrücklich Argumente als ref/out erwartet erklärt wird , Argumenttypen in Lambda-Ausdruck zu deklarieren ist weniger üblich, da der Compiler normalerweise auf sie schließen kann. In diesem Fall leitet der Compiler jedoch die Typen für out- oder ref-Argumente in lambda/anon-Ausdrücken derzeit nicht ab. Ich bin mir nicht sicher, ob dieses Verhalten ein Bug/Versehen ist oder ob es einen Sprachgrund gibt, warum das so sein muss, aber es gibt eine einfache Lösung.

EDIT: habe ich eine schnelle Überprüfung in VS2010 β2, und es sieht immer noch wie Sie die Argumenttypen definieren - sie sind für C# 4 nicht gefolgert

+4

Ich würde es weder als Fehler noch als Versehen betrachten. Ich denke, du solltest explizit sagen, dass es ein Out- oder Ref-Parameter ist. Warum man nicht einfach schreiben kann (out dt) => ... ist eine andere Sache. –

+1

Das ist eigentlich, was ich gemeint habe - die Markierung von Args explizit/ref wird in C# erwartet. Den Typ der Argumente für lambdas zu deklarieren ist weniger üblich, da der Compiler in den meisten Fällen eine ausgezeichnete Arbeit leistet, um den Typ abzuleiten. Ich werde meinen Beitrag aktualisieren, um das klarer zu machen. – LBushkin

+2

ist gerade darüber gestolpert - beachten Sie, dass Sie, wenn Sie mehrere Parameter haben, alle ihre Typen explizit deklarieren müssen, auch wenn sie nicht alle ref/out sind – drzaus

Verwandte Themen