Какие расширения языка реализует компилятор C #? - PullRequest
3 голосов
/ 09 ноября 2009

В блоге Эрика Липперта о судьях , компиляторе и спецификации C # он делает следующее утверждение:

(или намеренно; мы реализуем небольшое количество расширений формального языка C #)

И это заставило меня задуматься, какие именно расширения он имеет в виду?

Ответы [ 2 ]

3 голосов
/ 09 ноября 2009

В своих комментариях он дает некоторые ответы (и он дал некоторые в прошлых записях в блоге)

Обработка константы 0, типизированные ссылки (http://www.eggheadcafe.com/articles/20030114.asp), тип анализа условных выражений ...

Но он пытается сказать, что это не должно иметь никакого значения для конечного пользователя, потому что это странные угловые случаи (например, случай "(m => (m => (m => ...") ), которые необходимы для помощи компилятору и не являются частью спецификации.

Следуйте спецификации, и все будет в порядке.

(ниже добавлено 13:42)

Итак, я сказал: «Следуйте спецификации, и у вас все будет хорошо». Это действительно все советы, с которыми я могу вам помочь. Да, есть места, где компилятор отклоняется от спецификации. Но это на самом деле не задокументировано, отчасти потому, что они не знают, что делать. Они исправляют компилятор, чтобы придерживаться спецификации? Или они меняют спецификацию на странное поведение. В этом и заключается весь смысл обращения с нулевой статьей:

http://blogs.msdn.com/ericlippert/archive/2006/03/29/the-root-of-all-evil-part-two.aspx

В этом вся суть этих расширений. Они (по большей части) без документов, потому что (по большей части) они неизвестны. Кто знает, может быть, есть какая-то действительно странная обработка перечислений Flags, которая не совсем соответствует спецификации, но мы бы не узнали об этом, пока не сделаем с ними действительно странную вещь. Перечисления флагов были протестированы и должны в основном соответствовать спецификации, поэтому когда я говорю «следуйте спецификации, и у вас все будет хорошо», я имею в виду именно это. Вы не можете быть в порядке, потому что есть ошибки. но Эрик делает все возможное, чтобы исправить эти проблемы и сделать их известными тем временем.

2 голосов
/ 09 ноября 2009

Не считая ошибок, наиболее распространенным примером является varargs ; но большая часть COM-взаимодействия - это расширения; например конструкторы интерфейса .

17.5 в спецификации в основном гласит: «Все в System.Runtime.InteropServices может делать то, что хочет» MSDN документально это здесь .

...