Указанная вами спецификация за 6,5 долларов также говорит:
Выражение не имеет типа, но может быть неявно преобразовано в совместимый тип делегата или тип дерева выражений.
и $6.5.1:
Преобразование анонимной функции в тип делегата создает экземпляр делегата, который ссылается на анонимную функцию.
Анонимный метод просто можно определить с помощью лямбда-выражения, на самом деле это разные вещи.
лямбда-выражение не имеет типа и может быть неявно преобразовано в Выражение, используемое в выражение запроса LINQ и определение анонимного метода.
Итак, в вашем случае лямбда-выражение будет преобразовано в несовместимый экземпляр делегата, который не принимает аргументы.
Цитата из предоставленной вами спецификации говорит о
D f5 = delegate { Console.WriteLine("Delegate invoked..."); };
Это работает, потому что сигнатура не указана, и она будет автоматически скомпилирована в совместимый экземпляр делегата, который принимает (int, int).
"Если F не содержит сигнатуру анонимной функции" означает отсутствие сигнатуры, но '()' лямбды означает сигнатуру, которая не принимает аргументов. И лямбда не может быть объявлена без подписи, как указано в ответе @Johnny. О примерах делегатов: взгляните на 4-й пример в примере кода - он недействителен, потому что имеет несовместимую подпись, которая не принимает аргументы, 5-й пример не имеет подписи, и он действителен.
Вы также можете скопировать приведенный ниже пример и проверить, как он будет скомпилирован (предварительно прокомментируйте неверный код) https://sharplab.io/
public delegate void D(int i, int b);
public void Main(string[] args)
{
//valid, lambda expression will be converted to compatible delegate instance
D f1 = (int a, int b) => Console.WriteLine("Delegate invoked...");
f1(3, 4);
//INVALID, lambda expression will be converted to incompatible delegate instance
D f2 = () => Console.WriteLine("Delegate invoked...");
f2(3, 4);
//valid, assigning delegate with compatible signature
D f3 = delegate(int i, int j) { Console.WriteLine("Delegate invoked..."); };
f3(3, 4);
//INVALID, assigning delegate with incompatible signature
D f4 = delegate() { Console.WriteLine("Delegate invoked..."); };
f4(3, 4);
//valid, it will be automatically compiled to compatible delegate instance which accepts (int, int)
D f5 = delegate { Console.WriteLine("Delegate invoked..."); };
f5(3, 4);
}
29.01.2019