在C#中将lambda函数作为命名参数传递
- 论坛
- 在C#中将lambda函数作为命名参数传递
17 浏览
在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" ); } );