2011-06-14 65 views
2

最后一条语句不能编译。请参考评论和代码,了解我的问题的细节。lambda - >委托不编译

class Test 
{ 
    private static void Foo(Delegate d){} 

    private static void Bar(Action a){} 

    static void Main() 
    { 
     Foo(new Action(() => { Console.WriteLine("a"); })); // Action converts to Delegate implicitly 

     Bar(() => { Console.WriteLine("b"); }); // lambda converts to Action implicitly 

     Foo(() => { Console.WriteLine("c"); }); // Why doesn't this compile ? (lambda converts to Action implicitly, and then Action converts to Delegate implicitly) 
    } 
} 
+1

考虑在岗编译器错误消息。它将有助于搜索能力和上下文(对于之前没有遇到过这种情况的人) - 并考虑将标题*与问题相关* [错误消息的人性化形式应该是好的标题出发点] – 2011-06-14 02:36:52

+0

还有另一个问题:我们已经有lambda和Action,Func ,为什么我们还需要委托?如果没有这种叫做委托的东西,就不会有这样烦人的问题。 – 2011-06-14 05:05:31

回答

4

因为.net编译器不知道什么类型的代理将lambda转换成。它可能是一个行动,或者它可能是一个void MyDelegate()

如果如下改变它,它应该工作:

Foo(new Action(() => { Console.WriteLine("c"); })); 
+0

或者创建'private delegate void FooDelegate();'并使用它。 – 2011-06-14 02:31:50

1

为什么要编译器知道如何两步:从拉姆达 - >动作 - >委托?

这编译:

class Test 
{ 
    private static void Foo(Delegate d) { } 

    private static void Bar(Action a) { } 

    static void Main() 
    { 
     Foo(new Action(() => { Console.WriteLine("world2"); })); // Action converts to Delegate implicitly 

     Bar(() => { Console.WriteLine("world3"); }); // lambda converts to Action implicitly 

     Foo((Action)(() => { Console.WriteLine("world3"); })); // This compiles 
    } 
}