Каков эквивалентный код C# для анонимного делегата VB.NET?
Каков эквивалентный код C# для следующего VB.NET:
Dim moo = Function(x as String) x.ToString()
Я думал, что это должно работать:
var moo = (string x) => x.ToString();
но это привело к ошибке компилятора: Cannot assign lamda expression to an implicitly-typed local variable
После некоторого дальнейшего исследования я обнаружил, что тип переменной moo
(moo.GetType()
) в примере VB есть VB$AnonymousDelegate_0'2[System.String,System.String]
Есть ли что-нибудь подобное в C#?
4 ответа
Лямбда должна определить тип используемого делегата из его контекста. Неявно типизированная переменная будет определять ее тип из того, что ей присвоено. Каждый из них пытается вывести свой тип из другого. Вам нужно где-то явно использовать тип.
Есть много делегатов, которые могут иметь подпись, которую вы используете. Компилятору нужен какой-то способ узнать, какой использовать.
Самый простой вариант - использовать:
Func<string, string> moo = x => x.ToString();
Если вы действительно хотите все еще использовать var
Вы можете сделать что-то вроде этого:
var moo = new Func<string, string>(x => x.ToString());
Вам не нужно указывать тип параметра в лямбда-выражениях, просто сделайте следующее:
Func<string, string> moo = (x) => x.ToString();
Func<string, string> moo = (x) => x.ToString();
С var
C# не знает, хотите ли вы Func
а также Action
или что-то другое.
Проблема в том, что вы не можете использовать неявную типизацию для делегатов. Значение var
на LHS является реальной причиной проблемы, ваше лямбда-выражение в порядке. Если вы измените его на следующее, он скомпилируется и будет работать как положено;
Func<string, string> moo = (string x) => x.ToString();