我有一个C#4.0解析器。它接受'dynamic'作为关键字作为类型。我的解析器绊倒了 在以下形式的C#3.0程序中找到的语句:
dynamic = <exp> ;
那么,它真的是动态关键字吗?或者它仍然可以用作任意标识符名称? (如果是这样,为什么'int'的处理方式不同?)
是否有某个参考规范说明dynamic是否为关键字?最新的ECMA C#4规范甚至没有提到“动态”,我在MS网站上找到的最好的是“初步规范”,它说的是一个关键字,但我怀疑这只是草率的写作。
答案 0 :(得分:10)
dynamic
是C#4.0中的上下文关键字。第四版ECMA C#规范并未涉及C#4.0。 (注意2006年的出版日期。)
MSDN将其描述为关键字。
它也在这个table of contextual keywords中。 (向下滚动。)
答案 1 :(得分:7)
这不是if
,for
等“常规”关键字。
这是上下文关键字,例如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
等来自v1的关键字是为了避免混淆,但添加真正的关键字(不能用作标识符)会产生很高的兼容性成本。
答案 2 :(得分:1)
这是一个关键字。(见下面的编辑)我对你的意思有点困惑“为什么不是'int'以同样的方式对待?”
您无法执行此操作:int int = 5;
但你可以这样做,虽然这不是一个好习惯:int @int = 5;
C# 4.0 spec在第20.1节中确实提到了dynamic
。
编辑:更多信息......
允许使用动态作为变量名称,因此它不是关键字(但它是上下文关键字 - 请参阅Sean Devlin's post)。请参阅下面的截图,使用.NET 4.0 beta
查看Chris Burrow的blog post。帖子中引人注目的一句话:
如您所见,公开可见 使用动态类型的成员 实际上,在幕后,使用 发出时键入对象。 没有框架类型“动态”。 然而,那些“对象”都是 以这样的方式装饰 编译器(或任何其他人)可以告诉 它们是要处理的 动态。