Не существует типа делегата по умолчанию для анонимной функции, такой как () => { }
. Такое выражение неявно преобразуется в любой конкретный тип делегата правильной подписи и возвращаемого типа (с учетом различных естественных правил отклонения).
У вас может быть много типов делегатов, которые соответствуют:
namespace TestFramework
{
public delegate void TestDelegate();
}
namespace System
{
public delegate void Action();
}
namespace System.Threading
{
public delegate void ThreadStart();
}
...
Среди всех таких возможных конкретных типов делегатов (каждый из которых в качестве абстрактного System.Delegate
в качестве своего (непрямого) базового класса) не является предпочтительным .
Существует неявное преобразование из выражения () => { }
в каждое из них:
TestDelegate f = () => { };
Action g = () => { };
ThreadStart h = () => { };
...
Из-за неявного преобразования ваш вызов RunAction(() => { });
работает.
Но с RunDelegate(() => {});
невозможно сказать, какой конкретный тип делегата использовать. Вы должны сделать одно из:
RunDelegate((TestDelegate)(() => { }));
RunDelegate((Action)(() => { }));
RunDelegate((ThreadStart)(() => { }));
...
Комментарии к вашему вопросу верны.
С этим связан тот факт, что это не скомпилируется:
var f = () => { }; // illegal, shows that '() => { }' does NOT have type System.Action
И вы не можете использовать подвыражение типа myBool ? (() => { }) : null
и т. Д.