C#'dynamic'关键字......它真的是一个RESERVED关键字,还是只是一个标识符,当用作类型时意味着什么特殊?

Ira*_*ter 6 c# keyword language-specifications c#-4.0

我有一个C#4.0解析器.它接受'dynamic'作为关键字作为类型.我的解析器会跳过以下形式的C#3.0程序中发现的语句:

dynamic = <exp> ;
Run Code Online (Sandbox Code Playgroud)

那么,它真的是动态关键字吗?或者它仍然可以用作任意标识符名称?(如果是这样,为什么'int'不是以同样的方式对待)?

是否有某个参考规范说明dynamic是否是关键字?最新的ECMA C#4规范甚至没有提到"动态",我在MS网站上找到的最好的是"初步规范",它说它是一个关键字,但我怀疑这只是草率的写作.

Sea*_*lin 10

dynamic是C#4.0中的上下文关键字.第四版ECMA C#规范并未涉及C#4.0.(注意2006年的出版日期.)

MSDN将其描述为关键字.

它也在这个上下文关键字表中.(向下滚动.)


Jon*_*eet 7

它不是像"普通"这样的关键字if,for等等.

它是一个上下文关键字,如yield,from等等.

特别是,这编译:

object dynamic = 0; // dynamic is a contextual keyword
Run Code Online (Sandbox Code Playgroud)

但这不是:

object string = 0; // string is a regular keyword
Run Code Online (Sandbox Code Playgroud)

你必须string像这样"逃避" :

object @string = 0;
Run Code Online (Sandbox Code Playgroud)

这在后向兼容性方面很有意义:很多人不太可能创建一个被调用的类型dynamic(这会导致歧义; IIRC,"真实"类型在这种情况下获胜)而现有代码可能使用被调用的变量dynamic.

在某些方面,它甚至不需要是一个上下文关键字(我不相信规范曾经明确地指明它) - 你可以把它看作一个总是可用的类型的名称(像stringobject).我认为string等等是从v1制作关键字以避免混淆,但添加真正的关键字(不能用作标识符)现在会有很高的兼容性成本.