2010-01-02 6 views
9

J'ai un délégué défini dans mon code:Écrire un lambda ou une fonction anonyme qui accepte un paramètre sur

public bool delegate CutoffDateDelegate(out DateTime cutoffDate); 

Je voudrais créer délégué et initialiser avec un lambda ou une fonction anonyme, mais aucun de ces compilé .

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

Y at-il moyen de le faire?

+2

Realize c'est un peu vieux, mais je ne pense pas que c'est un doublon. La question liée concerne l'utilisation du paramètre out de la fonction parent (?) Dans la fonction anonyme, alors que celle-ci concerne la déclaration d'une fonction anonyme possédant son propre paramètre out. – Salvador

Répondre

18

Vous pouvez utiliser lambda ou la syntaxe délégué anonyme - il vous suffit de préciser le type de l'argument, et la marquer comme sur:

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; } 

Tout en déclarant explicitement arguments ref/out devrait , avoir à déclarer les types d'arguments dans l'expression lambda est moins commun car le compilateur peut normalement les déduire. Dans ce cas, cependant, le compilateur n'inclus pas actuellement les types d'arguments out ou ref dans les expressions lambda/anon. Je ne suis pas certain que ce comportement soit un bogue/une erreur ou s'il y a une raison linguistique pour laquelle cela doit être le cas, mais il y a une solution de contournement assez facile.

EDIT: J'ai fait une vérification rapide dans VS2010 β2, et il semble encore que vous devez définir les types d'arguments - ils ne sont pas inférées pour C# 4.

+4

Je ne le considérerais pas comme un bug ou un oubli. Je pense que vous devriez être explicite en disant que c'est un paramètre out ou ref. Pourquoi vous ne pouvez pas simplement écrire '(out dt) => ...' est une autre question. –

+1

C'est en fait ce à quoi je faisais référence - le marquage des arguments explicitement/ref est attendu en C#. Avoir à déclarer le type d'arguments pour lambdas est moins commun, puisque dans la plupart des cas le compilateur fait un excellent travail en déduisant le type. Je vais mettre à jour mon message pour le rendre plus clair. – LBushkin

+2

juste tombé à travers cela - notez que si vous avez plusieurs paramètres, vous devez déclarer tous leurs types explicitement, même s'ils ne sont pas tous ref/out – drzaus

Questions connexes