Bu, Google'daki "C # lambda ref" için en iyi sonuçlardan biri olduğu için; Yukarıdaki cevapları genişletmem gerektiğini hissediyorum. Eski (C # 2.0) anonim delege sözdizimi çalışır ve daha karmaşık imzaları (kapanışları da) destekler. Lambda ve anonim delegeler en azından derleyici arka ucunda algılanan uygulamayı paylaştılar (aynı değilse) - ve en önemlisi, kapanışları destekliyorlar.
Sözdizimini göstermek için, arama yaptığımda ne yapmaya çalışıyordum:
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;
};
}
Lambdas'ın prosedürel ve matematiksel olarak daha güvenli olduğunu unutmayın (daha önce bahsedilen ref değeri promosyonu nedeniyle): bir kutu solucan açabilirsiniz. Bu sözdizimini kullanırken dikkatlice düşünün.