27

考虑以下代码:

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)下编译;
4

0 回答 0