考虑以下代码:
var result = IDisposable.Dispose is object; //result equals false
对我(以及实际上引起我注意的我的同事)来说,这段代码是编译的,这让我感到惊讶。
首先我的想法是它IDisposable.Dispose
以某种方式转换为兼容的delegate
. 但是结果必须是true
因为当然delegate
是兼容object
的。
查看规范,我发现编译器对方法组进行了特殊处理(在is操作的上下文中):
如果 E 是一个方法组……结果是假的。
纯粹出于好奇,为什么它在规范中?为什么编译器允许它?为什么不抛出编译时错误(例如匿名函数)?
更新:
- 它在 VS2013 (12.0.21005.1) 和 .NET 4.5/4.5.1 中为我编译;
- piojo让我们知道这段代码不是在 Mono 中编译的(我自己无法检查);
- 它不是为 VS2015(4.5 或 3.5)中的 leppie 编译的;
- 未在 VS2013 / 12.0.30501.00 更新 2、.NET 4.5.2 目标(caramiriel)下编译;