Welcome

首页 / 软件开发 / C# / C#中派生类的方法里的匿名delegate调用基类的方法会产生无法验证的代码

C#中派生类的方法里的匿名delegate调用基类的方法会产生无法验证的代码2010-06-25 javaeye RednaxelaFX看来阅读一个开发人员的blog是获取知识的一个捷径,特别是当那位开发人员负责的产品是你天天都用的基础设施之一,例如说……编译器。在阅读Eric Lippert的blog时,我无意中了解到了很多我以前所不熟悉的知识,例如说一些语言特性,一些编程思想之类;但更有趣的,我了解到了很多他所负责的产品中的诡异地方。

开篇花絮:

假如我们现在有一个枚举类型E,其中有一个枚举值的名字是x。

你或许知道这个表达式是对的:

C#代码

0 | E.x

但是你或许不知道这个表达式(根据语言规范应该)是错的:

C#代码

0 | 0 | E.x

对此感到好奇的请到原文查看详情:The Root Of All Evil, Part One

错误在于,C# 2.0的规范中说明“字面量0”可以被转化为任意枚举类型。是“字面量0”,而不是“编译时常量0”。

这这这...Aargh, it"s driving me nuts! (模仿Eric的语气

如果你把下面的代码放到.NET Framework 3.5 Beta 2中编译测试的话,会看到编译器完全没对上面提及的第二种情况作出警告:

C#代码

enum E {
x = 1
}
class Program {
public static void Main(string[] args) {
E e = 0 | 0 | E.x;
}
}

编译器会抱怨局部变量e没有被使用过(也就潜在意味着这个变量没有作用,是多余的),但并没对这里我们关心的问题给出警告。正好刚装上了.NET Framework 3.5的RTM,测试结果仍然一样。Mono 1.2.5.1的在这点上的行为与前述一致。

在Unified C# 3.0 Specification的1.10 Enum中,规定了

引用

In order for the default value of an enum type to be easily available, the literal 0 implicitly converts to any enum type.

与前几个版本的规定没怎么改变,仍然是说“字面量0”而不是“编译时常量0”可以被转换为任意枚举类型。

于是.NET Framework与Mono都“很无奈”的在这点上无法与规范保持一致了。=_=||

C#里派生类的方法里的匿名delegate调用基类的方法会产生无法验证的代码

原文:Why are base class calls from anonymous delegates nonverifiable?