Так как это один из лучших результатов для "C # lambda ref" в Google; Я чувствую, что мне нужно расширить эти ответы. Старый (C # 2.0) синтаксис анонимного делегата работает и поддерживает более сложные подписи (а также замыкания). Лямбда и анонимные делегаты, по крайней мере, имеют общую воспринимаемую реализацию в бэкенде компилятора (если они не идентичны) - и, самое главное, они поддерживают замыкания.
Что я пытался сделать, когда делал поиск, чтобы продемонстрировать синтаксис:
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 процедурно и математически более безопасны (из-за упомянутой выше рекламы ref value): вы можете открыть банку с червями. Тщательно продумайте этот синтаксис.