Последнее утверждение не компилируется.Пожалуйста, обратитесь к комментариям вместе с кодом для деталей моего вопроса.
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 не знает, в какой тип делегата включить лямбду.Это может быть действие или void MyDelegate().
void MyDelegate()
Если вы измените его следующим образом, оно должно работать:
Foo(new Action(() => { Console.WriteLine("c"); }));
Почему компилятор должен знать, как выполнить два шага: из лямбды -> Действие -> Делегировать?
Компилируется:
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 } }