在C#中将lambda函数作为命名参数传递

17 浏览
0 Comments

在C#中将lambda函数作为命名参数传递

编译这个简单的程序:

class Program
{
    static void Foo( Action bar )
    {
        bar();
    }
    static void Main( string[] args )
    {
        Foo( () => Console.WriteLine( "42" ) );
    }
}

没有什么奇怪的地方。如果我们在lambda函数体中出现错误:

Foo( () => Console.LineWrite( "42" ) );

编译器会返回一个错误信息:

error CS0117: 'System.Console' 不包含 'LineWrite' 的定义

到目前为止都还好。现在,让我们在调用Foo时使用一个命名参数:

Foo( bar: () => Console.LineWrite( "42" ) );

这次,编译器的错误信息有点令人困惑:

error CS1502: 'CA.Program.Foo(System.Action)' 的最佳重载方法匹配有一些无效的参数
error CS1503: 参数 1:无法将 'lambda 表达式' 转换为 'System.Action'

到底发生了什么?为什么它没有报告实际的错误?

请注意,如果我们使用匿名方法而不是lambda,则会得到正确的错误信息:

Foo( bar: delegate { Console.LineWrite( "42" ); } );

0