我有一个 C# 4.0 解析器。它接受“动态”作为关键字作为类型。我的解析器在工作 C# 3.0 程序中发现以下形式的语句:
dynamic = <exp> ;
那么,它的动态真的是一个关键字吗?或者它仍然可以用作任意标识符名称吗?(如果是这样,为什么不以同样的方式对待'int')?
某处是否有说明动态是否为关键字的参考规范?最新的 ECMA C# 4 规范甚至没有提到“动态”,我在 MS 网站上能找到的最好的是“初步规范”,它说它是一个关键字,但我怀疑这只是草率的写作。
我有一个 C# 4.0 解析器。它接受“动态”作为关键字作为类型。我的解析器在工作 C# 3.0 程序中发现以下形式的语句:
dynamic = <exp> ;
那么,它的动态真的是一个关键字吗?或者它仍然可以用作任意标识符名称吗?(如果是这样,为什么不以同样的方式对待'int')?
某处是否有说明动态是否为关键字的参考规范?最新的 ECMA C# 4 规范甚至没有提到“动态”,我在 MS 网站上能找到的最好的是“初步规范”,它说它是一个关键字,但我怀疑这只是草率的写作。
这不是一个“正常”的关键字,比如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
dynamic
在某些方面,它甚至不需要是上下文关键字(而且我不相信规范曾经明确提到过它)——你可以把它想象成一个始终可用的类型的名称(比如string
和object
)。我想string
etc 是 v1 中的关键字以避免混淆,但是添加真正的关键字(不能用作标识符)现在会产生很高的兼容性成本。
这是一个关键字。(见下面的编辑)我对“为什么不以同样的方式对待'int'”的意思有点困惑?
你不能这样做:int int = 5;
但是你可以这样做,虽然这不是一个好习惯:int @int = 5;
C# 4.0 规范在第dynamic
20.1 节中确实提到了。
编辑:更多信息...
允许使用 dynamic 作为变量名,因此它不是关键字(但它是上下文关键字 - 请参阅Sean Devlin 的帖子)。请参阅下面使用 .NET 4.0 beta 的屏幕截图
查看 Chris Burrow 的博客文章。帖子中的一个有趣的引述:
如您所见,使用动态类型的公开可见成员实际上在幕后使用类型对象发出时。没有“动态”框架类型。但是,这些“对象”都以编译器(或其他任何人)可以判断它们是动态处理的方式进行装饰。