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

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

Mi chiedevo solo perché la discrepanza in realtà. : -/Perché i delegati anonimi possono omettere argomenti, ma i lambdas non possono?

+0

Sfortunatamente, non c'è una buona ragione per farlo, come dice @JaredPar di seguito. Solo qualcosa che è stato omesso (intenzionalmente o meno, non ne sono sicuro). –

+12

Questo sembra un lavoro per ... Eric Lippert man! – Tudor

+1

@Tuffor Inserisci il tema Batman qui. –

risposta

16

Jared è ovviamente corretto. Per aggiungere un altro paio di dettagli:

  • Quasi nessuno usa la sintassi "salta la lista dei parametri".
  • Non abbiamo scenario per lambda che richiede quella funzione.
  • La funzione complica l'inferenza di tipo e la risoluzione di sovraccarico e rende più probabile l'esito negativo di entrambi.
  • Quale sintassi vorresti per la funzione? Action<int> c = => {}; ??? Non ho alcun desiderio di trasformare => in un operatore con prefisso unario.

Così da un lato abbiamo la lista dei pro:

  • Lambda guadagno coerenza con una caratteristica inutile C# 2.0 che quasi nessuno conosce o utilizza - una caratteristica che, francamente, avremmo voluto 'd mai fatto, in primo luogo

ei contro:

  • realizzazione complica tipo già complesso in Algoritmi di risoluzione ferenza e sovraccarico
  • la funzione porta a più possibilità di errore per gli utenti senza alcun guadagno corrispondente nella potenza di rappresentazione.
  • senza ovviamente bello sintassi

Se è stata data quella lista di pro e contro, cosa faresti? Spero che "implementare la funzione" non sia una tua scelta; non era nostro.

+4

"Quasi nessuno usa la sintassi" salta la lista dei parametri ". Diamine, non sapevo nemmeno che esistesse. – BoltClock

+3

"quasi nessuno conosce o usa" ... Eppure ho visto quella sintassi per i delegati _event_, come in 'button1.Click + = delegate {MessageBox.Show (" Hello world "); }; '. È stato persino suggerito da due persone diverse in risposta a una mia domanda personale (http://stackoverflow.com/questions/7530743/c-sharp-add-event-handler-literal-code-block). Lo considereresti davvero un caso diverso? –

+6

Cool! Sembra che io possa evocare Eric Lippert! – Tudor

6

È essenzialmente semplice quanto sono diverse funzionalità con diversi set di scenari supportati. È quasi come chiedere

Perché i lambdas possono essere espressioni ma i delegati possono essere solo blocchi?

Problemi correlati