Karena ini adalah salah satu hasil teratas untuk "C # lambda ref" di Google; Saya merasa perlu mengembangkan jawaban di atas. Sintaks delegasi anonim yang lebih tua (C # 2.0) berfungsi dan mendukung tanda tangan yang lebih kompleks (juga penutupan). Delegasi Lambda dan anonim paling tidak telah berbagi implementasi yang dirasakan dalam backend compiler (jika mereka tidak identik) - dan yang paling penting, mereka mendukung penutupan.
Apa yang saya coba lakukan ketika saya melakukan pencarian, untuk menunjukkan sintaks:
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;
};
}
Perlu diingat bahwa Lambdas lebih aman secara prosedural dan matematis (karena promosi nilai referensi yang disebutkan sebelumnya): Anda mungkin membuka sekaleng cacing. Pikirkan baik-baik ketika menggunakan sintaks ini.