Похоже, что разработчики языка C # решили, что может быть строго два типа сигнатур анонимных функций - они определены как явная анонимная функция-сигнатура и неявная анонимная-function-signature .
явная-анонимная-функция-подпись является довольно стандартным списком параметров - в скобках ()
, разделенных запятыми, каждое определение параметра состоит изнеобязательного модификатора (out
или ref
), типа и идентификатора.
implicit-anonymous-function-signature - это значительно более простой список параметров - между ()
, заключенные в квадратные скобки и разделенные запятыми, каждое определение параметра состоит только из идентификатора.
Вы не можете смешивать и сопоставлять две формы, вам нужно выбрать одну или другую.Это, вероятно, упрощает синтаксический анализ и делает вывод типов включенным / выключенным, а не «наполовину включенным» (о чем действительно говорит CS0748
).
Это, безусловно, позволяет им создавать другие правила внутриязык легче указать, поскольку можно говорить о лямбдах с тем или иным типом подписи.
И поэтому, если вам нужно включить модификатор (out
), у вас нет выбора - у вас есть выбориспользовать явную анонимную функцию-подпись .
из спецификации C #, версия 5:
лямбда-выражение :
- подпись анонимной функции
=>
тело анонимной функции
аноним-Выражение метода :
delegate
явная анонимная функция-подпись opt block
подпись анонимной функции :
явная анонимная функция-подпись :
(
явный анонимный список параметров-функций opt )
явный анонимный список параметров функции :
явный параметр анонимной функции
явный-анонимный-параметр-список-функций ,
явный-анонимный-параметр-функция
явный-параметр анонимной функции :
- модификатор параметра анонимной функции opt тип идентификатор
модификатор параметра-анонимной функции :
неявная анонимная функция-подпись :
список неявных анонимных функций-параметров :
неявный-параметр анонимной функции
список неявных анонимных параметров функции ,
параметр неявной анонимной функции
параметр неявной анонимной функции :