C#编译器实现了哪些语言扩展?

3
在Eric Lippert关于裁判员、C#编译器和规范的博客文章中,他提到了以下声明:

(或者是有意为之;我们对正式的C#语言实现了一些扩展)

这让我想知道,他具体指的是哪些扩展?

2个回答

3
在他的评论中,他提供了一些答案(并在之前的博客文章中也提供了一些答案),这些包括处理常数0、类型引用(http://www.eggheadcafe.com/articles/20030114.asp)、条件表达式的类型分析等。但他想说的是,这些都是一些边角情况,对最终用户来说并不重要,它们只是为了帮助编译器而存在,并不是规范的一部分。遵循规范,你就可以放心使用。(下面添加于下午1:42)所以我说,“遵循规范,你就可以放心使用。”这真的是我能给出的所有建议了。是的,有一些地方编译器与规范不符,但这并没有得到充分记录,部分原因是他们不知道该怎么做。他们是将编译器修复为遵守规范?还是改变规范以适应奇怪的行为?这基本上就是处理零文章的全部内容。

http://blogs.msdn.com/ericlippert/archive/2006/03/29/the-root-of-all-evil-part-two.aspx

这些扩展的目的就在于此。它们大多数情况下没有文档,因为它们大多数情况下是未知的。谁知道,也许有一些非常奇怪的标志枚举处理方式并不完全符合规范,但除非我们做了一些非常奇怪的事情,否则我们不会真正了解它。标志枚举已经经过测试,应该大部分遵循规范,所以当我说“遵循规范,你应该没问题”时,我的意思就是这样。你可能不行,因为有陷阱。但Eric正在尽力解决这些问题,并在中间期间使它们变得更加明显。

1
按照规范办事,你就会没问题。了解扩展名可以成为了解规范的一部分(如果你知道它们是扩展名,就知道它们不在规范内)。因此,了解扩展名对于遵循规范是有帮助的。 - Michael Burr
我甚至没有想到看评论,是我在 Google Reader 上看到的。 - jasonh
是的,我知道大多数情况下遵循规范就可以了,但我仍然对不遵循规范的领域感到好奇。你永远不知道,有一天可能会派上用场! :) - jasonh

2
不计算错误,最常见的例子是可变参数;但COM互操作的许多部分都是扩展,例如接口构造器。规范中的17.5基本上是说“System.Runtime.InteropServices中的任何东西都可以做它想做的事情”。MSDN在这里中记录了此信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接