C#“动态”关键字…它真的是一个保留关键字还是只是一个在用作类型时意味着特殊含义的标识符?
-
22-09-2019 - |
题
我有一个 C# 4.0 解析器。它接受“dynamic”作为关键字作为类型。我的解析器旅行对工作的c#3.0程序中发现的语句的形式:
dynamic = <exp> ;
那么,dynamic真的是一个关键字吗?或者它仍然可以用作任意标识符名称吗?(如果是这样,为什么'int'不以同样的方式对待)?
是否有参考规范说明动态是否是关键字?最新的 ECMA C# 4 规范甚至没有提到“动态”,我在 MS 网站上能找到的最好的规范是一个“初步规范”,它说它是一个关键字,但我怀疑这只是草率的书写。
解决方案
dynamic
是上下文关键字作为C#4.0。在ECMA C#规范第四版不是指C#4.0。 (注意2006年出版日期。)
MSDN 把它描述为一个关键字。
这也是在上下文关键字一个此表>。 (向下滚动。)
其他提示
这不像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
)。我可以想象从V1,以避免混淆该string
等作了关键字,但添加真正的关键字(其不能被用作标识符)现在将具有高的相容性的成本。
这是一个关键字。 (参见下面的编辑)我对你的意思有点困惑“为什么'int'不以同样的方式对待?”
你不能这样做: int int = 5;
但是你可以这样做,尽管这不是一个好的做法: int @int = 5;
这 C# 4.0 规范 确实提到 dynamic
在第 20.1 节中。
编辑:更多信息...
允许使用dynamic作为变量名,所以它不是一个关键字(但它是一个上下文关键字 - 请参阅 肖恩·德夫林的帖子)。请参阅下面使用 .NET 4.0 beta 的屏幕截图
看看克里斯·伯罗的 博客文章. 。帖子中的一段有趣的引用:
如您所见,使用类型动态的公共可见成员在幕后发出时使用它们。没有框架类型“动态”。但是,这些“对象”的装饰方式都以使编译器(或其他任何人)可以说明它们的本意是动态处理的。