лямбда -> делегат не компилируется - PullRequest
2 голосов
/ 14 июня 2011

Последнее утверждение не компилируется.Пожалуйста, обратитесь к комментариям вместе с кодом для деталей моего вопроса.

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

Ответы [ 2 ]

4 голосов
/ 14 июня 2011

Поскольку компилятор .net не знает, в какой тип делегата включить лямбду.Это может быть действие или void MyDelegate().

Если вы измените его следующим образом, оно должно работать:

Foo(new Action(() => { Console.WriteLine("c"); }));
1 голос
/ 14 июня 2011

Почему компилятор должен знать, как выполнить два шага: из лямбды -> Действие -> Делегировать?

Компилируется:

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