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

时间:2010-01-23 17:32:38

标签: c# c#-4.0 keyword language-specifications

我有一个C#4.0解析器。它接受'dynamic'作为关键字作为类型。我的解析器绊倒了 在以下形式的C#3.0程序中找到的语句:

dynamic = <exp> ;

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

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

3 个答案:

答案 0 :(得分:10)

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

MSDN将其描述为关键字。

它也在这个table of contextual keywords中。 (向下滚动。)

答案 1 :(得分:7)

这不是iffor等“常规”关键字。

这是上下文关键字,例如yieldfrom等。

特别是,这编译:

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

但这不是:

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

你必须像这样“逃避”string

object @string = 0;

这在向后兼容性方面很有意义:很多人不太可能创建一个名为dynamic类型(这会导致歧义; IIRC是“真正的”类型在这种情况下获胜)而非常现有代码可能使用名为dynamic的变量。

在某些方面,它甚至不需要是一个上下文关键字(我不相信规范曾经明确地将其引用) - 您可以将其视为始终可用的类型的名称(例如stringobject)。我认为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

dynamic

查看Chris Burrow的blog post。帖子中引人注目的一句话:

  

如您所见,公开可见   使用动态类型的成员   实际上,在幕后,使用   发出时键入对象。   没有框架类型“动态”。   然而,那些“对象”都是   以这样的方式装饰   编译器(或任何其他人)可以告诉   它们是要处理的   动态。