Poiché questo è uno dei migliori risultati per "C# lambda ref" su Google; Sento che ho bisogno di espandere le risposte di cui sopra. La sintassi del delegato anonimo più vecchio (C# 2.0) funziona e supporta firme più complesse (come pure le chiusure). I delegati Lambda e anonimi hanno perlomeno condiviso un'implementazione percepita nel backend del compilatore (se non sono identici) e, cosa più importante, supportano le chiusure.
Quello che stavo cercando di fare quando ho fatto la ricerca, per dimostrare la sintassi:
public static ScanOperation<TToken> CreateScanOperation(
PrattTokenDefinition<TNode, TToken, TParser, TSelf> tokenDefinition)
{
var oldScanOperation = tokenDefinition.ScanOperation; // Closures still work.
return delegate(string text, ref int position, ref PositionInformation currentPosition)
{
var token = oldScanOperation(text, ref position, ref currentPosition);
if (token == null)
return null;
if (tokenDefinition.LeftDenotation != null)
token._led = tokenDefinition.LeftDenotation(token);
if (tokenDefinition.NullDenotation != null)
token._nud = tokenDefinition.NullDenotation(token);
token.Identifier = tokenDefinition.Identifier;
token.LeftBindingPower = tokenDefinition.LeftBindingPower;
token.OnInitialize();
return token;
};
}
Basta tenere a mente che Lambda sono proceduralmente e matematicamente sicuro (a causa della promozione del valore ref accennato in precedenza): potresti aprire una lattina di vermi. Pensa attentamente quando usi questa sintassi.
fonte
2011-07-11 13:59:06
posso chiedere quale fosse la soluzione che hai avuto trovato ? – Beatles1692
Riguarda gli iteratori, ma gran parte dello stesso ragionamento in questo post (anche di Eric Lippert — si trova in fondo nel team di progettazione della lingua) si applica a lambdas: –