2012-02-16 20 views
19
//ok 
Action<int> CallbackWithParam1 = delegate { };  

//error CS1593: Delegate 'System.Action<int>' does not take 0 arguments 
Action<int> CallbackWithParam2 =() => { }; 

Me pregunto por qué la discrepancia realmente. : -/¿Por qué los delegados anónimos omiten argumentos, pero lambdas no?

+0

Desafortunadamente, no existe una buena razón para ello, como dice @JaredPar a continuación. Solo algo que se omitió (ya sea intencionalmente o no, no estoy seguro). –

+12

Esto parece un trabajo para ... Eric Lippert hombre! – Tudor

+1

@Tudor Inserta el tema de Batman aquí. –

Respuesta

16

Jared es por supuesto correcto. Para agregar un par de detalles más:

  • Casi nadie usa la sintaxis "omita la lista de parámetros".
  • No tenemos ningún escenario para lambdas que requiera esa característica.
  • La característica complica la inferencia de tipo y la resolución de sobrecarga, y hace que sea más probable que fallen ambas.
  • ¿Qué sintaxis le gustaría para la función? Action<int> c = => {}; ??? No tengo ningún deseo de hacer => en un operador de prefijo unario.

Así, por un lado tenemos la lista de pros:

  • Lambdas consistencia de ganancia con una innecesaria característica de C# 2.0 que casi nadie conoce o utiliza - una característica que, francamente, nos gustaría que nos 'd nunca había hecho en el primer lugar

y los contras:

  • aplicación complica tipo ya complejo en Los algoritmos de resolución de sobrecarga y sobrecarga
  • característica conducen a más posibilidades de errores para los usuarios sin la ganancia correspondiente en potencia de representación.
  • hay obviamente agradable sintaxis

Si le dieron esa lista de pros y contras, ¿qué harías? Espero que "implementar la función" no sea tu elección; no fue nuestro

+4

"Casi nadie usa la sintaxis 'omita la lista de parámetros'". Diablos, ni siquiera sabía que existía. – BoltClock

+3

"casi nadie conoce ni utiliza" ... Y sin embargo, he visto esa sintaxis para _event_delegales, como en 'button1.Click + = delegate {MessageBox.Show (" Hello world "); }; '. Incluso fue sugerido por dos personas diferentes en respuesta a una pregunta mía (http://stackoverflow.com/questions/7530743/c-sharp-add-event-handler-literal-code-block). ¿Realmente considerarías un caso diferente? –

+6

¡Genial! ¡Parece que puedo convocar a Eric Lippert! – Tudor

6

Es esencialmente tan simple como que son funciones diferentes con diferentes conjuntos de escenarios admitidos. Es casi como preguntar

¿Por qué pueden ser lambdas las expresiones pero los delegados solo pueden ser bloques?

Cuestiones relacionadas