2010-04-20 26 views
6

estoy confundido por qué esto compila:¿Por qué un delegado sin parámetros compila?

private delegate int MyDelegate(int p1, int p2); 

    private void testDelegate() 
    { 
     MyDelegate imp = delegate 
     { 
      return 1; 
     }; 
    } 

MyDelegate debe ser un puntero a un método que toma dos parámetros int y devuelve otra int, ¿verdad? ¿Por qué se me permite asignar un método que no toma parámetros?

Curiosamente, éstos no compila (que se queja de la falta de adaptación de la firma, como era de esperar)

private void testDelegate() 
    { 
     // Missing param 
     MyDelegate imp = delegate(int p1) 
     { 
      return 1; 
     }; 

     // Wrong return type 
     MyDelegate imp2 = delegate(int p1, int p2) 
     { 
      return "String"; 
     }; 
    } 

Gracias por cualquier ayuda!

Ryan

Respuesta

5

Pues bien, en la primera muestra el compilador puede ver fácilmente que no se utilizan parámetros, y sustituir unos maniquíes.

Esto parece ser una decisión de diseño, en algún lugar en el camino de indicar el todo en .NET 1, a través de los métodos anónimos en .NET 2 a lambdas en .Net 3

6

Su primer ejemplo de sintaxis es corto mano si el delegado no necesita los parámetros. Si necesita incluso uno de ellos, debe proporcionarlos todos, por lo que la primera parte del segundo ejemplo no se compilará.

+0

Muchas gracias por su respuesta; tiene buen sentido. Marqué el anterior como "correcto" simplemente porque llegó primero. ¡Gracias! – Ryan

Cuestiones relacionadas