Почему методы с одним выражением требуют скобок?

public void Finalise() ProcessFinalisation(true); 

Не компилируется, но правильная версия:

 public void Finalise() { ProcessFinalisation(true); } 

Компиляция отлично (конечно).

Если мне разрешено, если без скобок, когда следующий код имеет только одну строку:

 if(true) CallMethod(); 

Почему то же самое не допускается для методов с одной следующей строкой? Есть ли техническая причина?

    Начиная с C # 6.0 вы можете объявить:

     void WriteToConsole(string word) => Console.WriteLine(word) 

    И тогда назовите это как обычно:

     public static void Main() { var word = "Hello World!"; WriteToConsole(word); } 

    Очевидным ответом является спецификация языка; для рассуждения … Я предполагаю, в основном, простоту – просто не стоило накладных расходов на проверку работоспособности, проверяя спецификацию и компилятор для крошечного крошечного количества методов с одним заявлением. В частности, я могу потенциально видеть проблемы с общими ограничениями и т. Д. ( where T : IBlah, new() в конце подписи).

    Обратите внимание, что не использование фигурных скобок может иногда приводить к двусмысленности, а в некоторых местах неодобрительно. Я немного более прагматичен, чем лично, но каждый по своему усмотрению.

    Также может быть интересно, что C # внутри бритвы не позволяет использовать без явных скобок. В любом случае (т.е. даже для if т. Д.).

    Марк в принципе прав. Чтобы немного расширить его ответ: существует ряд мест, где C # требует скопированный блок операторов, а не разрешать «голый» оператор. Они есть:

    • тело метода, конструктор, деструктор, аксессуар свойств, средство доступа к событиям или аксессуар индексатора.
    • блок try, catch, наконец, проверенный, непроверенный или небезопасный регион.
    • блок оператора lambda или анонимный метод
    • блок оператора if или loop, если блок непосредственно содержит объявление локальной переменной. (То есть «while (x! = 10) int y = 123;» является незаконным, вам нужно скопировать декларацию.)

    В каждом из этих случаев можно было бы получить недвусмысленную грамматику (или эвристику, чтобы устранить двусмысленную грамматику) для функции, в которой единый непривязанный отчет является законным. Но в чем дело? В каждой из этих ситуаций вы ожидаете увидеть несколько утверждений; единичные заявления – редкий, маловероятный случай. Похоже, что это не очень важно сделать грамматику однозначной для этих очень маловероятных случаев.

    Короткий ответ: C # обозначается после C, а C мандаты, которые функционируют, связаны друг с другом из-за того, как раньше использовались объявления функций C.

    Длинная версия с историей: Назад в K & R C, функции были объявлены следующим образом:

     int function(arg1, arg2) int arg1; int arg2; { code } 

    Конечно, вы не могли бы иметь никаких функций в этой схеме. ANSI C обязал синтаксис, который мы все знаем и любим:

     int function(int arg1, int arg2) { code } 

    но не разрешали задействованные функции, потому что они могли бы вызвать хаос со старыми компиляторами, которые знали только синтаксис K & R [и поддержка объявлений K & R по-прежнему была необходима].

    Время продолжалось, а годы спустя C # был спроектирован вокруг C [или C ++, с той же разницей в синтаксисе], и, поскольку C не разрешал никаких функций, ни C #.