2010-01-02 6 views
9

he definido un delegado en mi código:Escribir un lambda o función anónima que acepta un parámetro de salida

public bool delegate CutoffDateDelegate(out DateTime cutoffDate); 

Me gustaría crear delegado e inicializar con una lambda o función anónima, pero ninguno de estos compilado .

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

¿Hay alguna manera de hacerlo?

+2

consciente de que es un poco viejo, pero yo no creo que sea un duplicado La pregunta vinculada es acerca de usar el parámetro out de la función parent (?) Dentro de la función anónima, mientras que esta se trata de declarar una función anónima que tiene su propio parámetro out. – Salvador

Respuesta

18

Puede utilizar cualquiera de lambda o sintaxis delegado anónimo - sólo tiene que especificar el tipo del argumento, y marcarla como fuera:

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

Mientras que declara explícitamente argumentos como se espera de entrada/salida ref , tener que declarar tipos de argumentos en la expresión lambda es menos común ya que el compilador normalmente puede inferirlos. En este caso, sin embargo, el compilador actualmente no infiere los tipos para argumentos out o ref en expresiones lambda/anon. No estoy seguro de si este comportamiento es un error/supervisión o si hay un motivo de lenguaje por el que debe ser así, pero hay una solución bastante fácil.

EDIT: Hice un registro rápido β2 VS2010, y todavía parece que tiene que definir los tipos de argumentos - que no se infieren para C# 4.

+4

No lo consideraría un error ni un descuido. Creo que deberías ser explícito al decir que es un parámetro de salida o ref. Por qué no puedes simplemente escribir '(out dt) => ...' es otro asunto. –

+1

A eso es a lo que me refería: se espera marcar args explícitamente out/ref en C#. Tener que declarar el tipo de argumentos para lambdas es menos común, ya que en la mayoría de los casos el compilador hace un excelente trabajo al inferir el tipo. Actualizaré mi publicación para que quede más claro. – LBushkin

+2

simplemente tropezó con esto - tenga en cuenta que si tiene múltiples parámetros, debe declarar todos sus tipos explícitamente, incluso si no son todos ref/out – drzaus

Cuestiones relacionadas