Интересно о C#: игнорирование скобок

понедельник, 12 апреля 2010, Александр Краковецкий

Интересный вопрос задали на StackOverflow: есть ли различие между “return something;” и “return (something);” в C#?

На практике разницы нет.

В теории разница может быть. Есть три интересных момента в спецификации C#, из-за которых могут возникнуть проблемы.

Первое, при преобразовании анонимных функций в типы делегатов (delegate types) и деревья выражений (expression trees).

Например, имеем следующий код:

Func F1() { return ()=>1; }
Func F2() { return (()=>1); }

F1 полностью легальный, в то время, когда F2 технически нет. Спецификация говорит в секции 6.5, что есть преобразование с лямбда-выражения в совместимый тип делегата. Это лямбда-выражение? Нет. Это выражение в скобках, которое содержит лямбда-выражение.

Компилятор делает небольшую поблажку здесь и пропускает это несоответствие.

Дальше:

int M() { return 1; }
Func F3() { return M; }
Func F4() { return (M); }

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”?


Ищите нас в интернетах!

Комментарии

Свежие вакансии