Передача лямбда-функций в качестве именованных параметров в C #

Скомпилируйте эту простую программу:

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" ); } );
35
задан Danko Durbić 8 November 2011 в 16:11
поделиться