【发布时间】:2011-12-24 14:33:32
【问题描述】:
编译这个简单的程序:
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' 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'
发生了什么事?为什么不报实际错误?
请注意,如果我们使用匿名方法而不是 lambda,我们确实会收到正确的错误消息:
Foo( bar: delegate { Console.LineWrite( "42" ); } );
【问题讨论】:
-
@MatějZábský 这篇文章的重点是 C# 编译器没有完全解释引入命名参数时的问题所在。
LineWrite是编译错误的例子。他已经知道错误是什么;只是为什么编译器没有一直这样显示它。 -
使用大括号似乎会导致错误more clear(尽管我still don't 看到否定它们的问题。-- 除非单声道命令行编译器更明确)
-
@Brad 这不是大括号;这是 ideone.com 使用的是 Mono 编译器,而不是 MSFT C# 编译器。 (这表明这可能只是一个错误。)
-
@dlev:确实,与其说是真正的原因,不如说是出于好奇;有趣的单声道在报告真正的错误方面做得更好。
-
@BradChristie:同样的错误,在 Visual C# 2010 编译器上有或没有大括号。
标签: c# lambda named-parameters