Ключевое слово C # 'dynamic'… действительно ли это ЗАРЕЗЕРВИРОВАННОЕ ключевое слово или просто идентификатор, который означает что-то особенное при использовании в качестве типа?

StackOverflow https://stackoverflow.com/questions/2124001

Вопрос

У меня есть анализатор C # 4.0.Он принимает 'dynamic' как ключевое слово в качестве типа.Мой анализатор ошибается инструкции, найденные в рабочих программах на C # 3.0, имеют вид:

dynamic = <exp> ;

Итак, это действительно ключевое слово dynamic?Или его все еще можно использовать как произвольное имя идентификатора?(Если да, то почему 'int' не обрабатывается таким же образом)?

Есть ли где-нибудь ссылочная спецификация, в которой указано, является ли dynamic ключевым словом?В последней спецификации ECMA C # 4 даже не упоминается 'dynamic', и лучшее, что я могу найти на сайте MS, - это "предварительная спецификация", в которой указано ключевое слово a, но я подозреваю, что это просто неаккуратное написание.

Это было полезно?

Решение

dynamic является контекстным ключевым словом начиная с C # 4.0.Четвертое издание спецификации ECMA C # не относится к C # 4.0.(Обратите внимание на дату публикации 2006 года.)

MSDN описывает это как ключевое слово.

Это также есть в этом таблица контекстных ключевых слов.(Прокрутите вниз.)

Другие советы

Это не "обычное" ключевое слово, как if, for и т.д.

Это контекстуальный ключевое слово like yield, from и т.д.

В частности, это компилирует:

object dynamic = 0; // dynamic is a contextual keyword

но это не:

object string = 0; // string is a regular keyword

Вам пришлось бы "сбежать". string вот так:

object @string = 0;

Это имеет большой смысл с точки зрения обратной совместимости:маловероятно, что многие люди создали бы Тип вызванный dynamic (что вызвало бы двусмысленность;IIRC в этом случае выигрывает "реальный" тип), тогда как это очень вероятно, что существующий код использует переменные, вызываемые dynamic.

В некотором смысле это даже не обязательно должно быть контекстное ключевое слово (и я не верю, что спецификация когда-либо явно ссылается на него как таковое) - вы можете думать о нем как о названии типа, который всегда доступен (например string и object).Я бы предположил, что string etc были сделаны ключевыми словами из версии v1, чтобы избежать путаницы, но добавление подлинных ключевых слов (которые нельзя использовать в качестве идентификаторов) теперь привело бы к высокой стоимости совместимости.

Это ключевое слово. (смотрите Редактирование ниже) Я немного сбит с толку тем, что вы подразумеваете под "почему 'int' не обрабатывается таким же образом?"

Ты не можешь этого сделать: int int = 5;

Но вы можете это сделать, хотя это и не очень хорошая практика: int @int = 5;

В Спецификация C # 4.0 упоминает ли dynamic в разделе 20.1.

Редактировать:Подробная информация...

Использование dynamic в качестве имени переменной разрешено, поэтому это не ключевое слово (но это контекстное ключевое слово - см. Сообщение Шона Девлина).Смотрите скриншот ниже, используя бета-версию .NET 4.0

dynamic

Посмотрите на Криса Берроу запись в блоге.Интересная цитата из поста:

Как вы можете видеть, публично видимые члены, которые используют тип dynamic на самом деле, за кулисами, используют тип object при их отправке.Не существует фреймворкового типа "dynamic". Однако все эти "объекты" оформлены таким образом, что компилятор (или кто-либо другой) может сказать что они предназначены для обработки динамически.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top