Скомпилируйте эту простую программу:
class Program
{
static void Foo( Action bar )
{
bar();
}
static void Main( string[] args )
{
Foo( () => Console.WriteLine( "42" ) );
}
}
Ничего странного. Если мы сделаем ошибку в теле лямбда-функции:
Foo( () => Console.LineWrite( "42" ) );
компилятор возвращает сообщение об ошибке:
error CS0117: 'System.Console' does not contain a definition for 'LineWrite'
Пока все хорошо. Теперь позвольте использовать именованный параметр в вызове Foo
:
Foo( bar: () => Console.LineWrite( "42" ) );
На этот раз сообщения компилятора несколько запутывают:
error CS1502: The best overloaded method match for
'CA.Program.Foo(System.Action)' has some invalid arguments
error CS1503: Argument 1: cannot convert from 'lambda expression' to 'System.Action'
Что происходит? Почему он не сообщает о фактической ошибке?
Обратите внимание, что мы получаем правильное сообщение об ошибке, если мы используем анонимный метод вместо лямбда:
Foo( bar: delegate { Console.LineWrite( "42" ); } );