6

我有一个 C# 4.0 解析器。它接受“动态”作为关键字作为类型。我的解析器在工作 C# 3.0 程序中发现以下形式的语句:

dynamic = <exp> ;

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

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

4

3 回答 3

10

dynamic是 C# 4.0 的上下文关键字。ECMA C# 规范的第四版没有提到 C# 4.0。(注意 2006 年的出版日期。)

MSDN将其描述为关键字。

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

于 2010-01-23T17:42:33.973 回答
7

这不是一个“正常”的关键字,比如iffor

这是一个上下文关键字yield,例如from等。

特别是,它编译:

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

但这不是:

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

你必须string像这样“逃脱”:

object @string = 0;

这在向后兼容性方面很有意义:很多人不太可能创建名为.dynamicdynamic

在某些方面,它甚至不需要是上下文关键字(而且我不相信规范曾经明确提到过它)——你可以把它想象成一个始终可用的类型的名称(比如stringobject)。我想stringetc 是 v1 中的关键字以避免混淆,但是添加真正的关键字(不能用作标识符)现在会产生很高的兼容性成本。

于 2010-01-23T17:56:35.697 回答
1

这是一个关键字。(见下面的编辑)我对“为什么不以同样的方式对待'int'”的意思有点困惑?

你不能这样做:int int = 5;

但是你可以这样做,虽然这不是一个好习惯:int @int = 5;

C# 4.0 规范在第dynamic20.1 节中确实提到了。

编辑:更多信息...

允许使用 dynamic 作为变量名,因此它不是关键字(但它是上下文关键字 - 请参阅Sean Devlin 的帖子)。请参阅下面使用 .NET 4.0 beta 的屏幕截图

动态的

查看 Chris Burrow 的博客文章。帖子中的一个有趣的引述:

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

于 2010-01-23T17:37:05.890 回答