Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# lambda->delegate未编译_C#_.net_Delegates_Lambda_Action - Fatal编程技术网

C# lambda->delegate未编译

C# lambda->delegate未编译,c#,.net,delegates,lambda,action,C#,.net,Delegates,Lambda,Action,最后一条语句不编译。有关我的问题的详细信息,请参考注释和代码 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

最后一条语句不编译。有关我的问题的详细信息,请参考注释和代码

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)
    }
}

因为.net编译器不知道将lambda转换为什么类型的委托。它可以是一个动作,也可以是一个void MyDelegate

如果您按以下方式更改它,它应该可以工作:

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

为什么编译器应该知道如何执行两步:从lambda->Action->Delegate

这包括:

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
    }
}

或创建私有委托或代理;并使用它。考虑在帖子中包含编译器错误消息。这将有助于搜索能力和上下文的人谁没有遇到这种情况之前-并考虑使标题相关的问题:[人性化的形式的错误信息应该是一个很好的起点,标题]仍然还有另一个问题:我们已经有lambda和行动,FUNC,为什么我们仍然需要代表?如果没有所谓的委托(delegate),就不会有这样烦人的问题。