2012-04-19 11 views
8

Dados los siguientes códigos de ejemplo:La asignación de un método anónimo para delegar utilizando paréntesis da error del compilador?

static void SomeMethod() 
{ 
    Action<int,int> myDelegate; 

    //... 

    myDelegate = delegate { Console.WriteLine(0); }; 
    myDelegate = delegate() { Console.WriteLine(0); }; // compile error 

} 

¿Cuál es la diferencia entre

myDelegate = delegate { Console.WriteLine(0); }; 

y

myDelegate = delegate() { Console.WriteLine(0); }; 

?

En este ejemplo, la segunda instrucción genera error de compilación mientras que la primera no.

Respuesta

21

un método anónimo tiene la sintaxis delegateparámetro de la lista{lista-instrucciones}. La lista de parámetros es opcional.

Si omite la lista de parámetros, el método anónimo es compatible con cualquier tipo de delegado cuyos parámetros no estén marcados como "fuera" o "ref".

Si suministra la lista de parámetros, entonces debe coincidir exactamente con los tipos de parámetros delegados.

En el primer caso lo está omitiendo, y en el segundo caso lo está suministrando pero no coincide con los parámetros de delegado. Entonces, delegate {} es legal, y delegate (int i, int j) { } es legal, pero delegate() {} no lo es.

En cualquier caso, es mejor que uses una expresión lambda; es la sintaxis más común en el nuevo código: (i, j)=>{ };

Cuestiones relacionadas