Интересно о C#: игнорирование скобок
Интересный вопрос задали на StackOverflow: есть ли различие между “return something;” и “return (something);” в C#?
На практике разницы нет.
В теории разница может быть. Есть три интересных момента в спецификации C#, из-за которых могут возникнуть проблемы.
Первое, при преобразовании анонимных функций в типы делегатов (delegate types) и деревья выражений (expression trees).
Например, имеем следующий код:
Func
Func
F1 полностью легальный, в то время, когда F2 технически нет. Спецификация говорит в секции 6.5, что есть преобразование с лямбда-выражения в совместимый тип делегата. Это лямбда-выражение? Нет. Это выражение в скобках, которое содержит лямбда-выражение.
Компилятор делает небольшую поблажку здесь и пропускает это несоответствие.
Дальше:
int M() { return 1; }
Func
Func
F3 – легальный, в то время когда F4 нет. Ведь секция 7.5.3 говорит, что выражения в скобках не должны содержать групповой метод (method group). Опять таки, для удобства мы (совершенно случайно!) разрешаем выполнения этого кода.
Дальше:
enum E { None }
E F5() { return 0; }
E F6() { return (0); }
F5 – легальный, в то время как F6 нет. Спецификация говорит, что есть преобразование с literal zero в любой тип перечисления (enumerated type). "(0)" не является literal zero. Мы нарушили спецификацию здесь и разрешили любое выражение во время компиляции, которое равно 0 и не является лишь literal zero.
Поэтому, в каждом случае мы разрешили использовать подобный код, который, фактически, является не легальным.
Источник: http://blogs.msdn.com/ericlippert/archive/2010/04/12/ignoring-parentheses.aspx
P.S. Кто подскажет правильный вариант перевода “literal zero”?