Рассмотрим следующий код:
var result = IDisposable.Dispose is object; //result equals false
Для меня было неожиданностью (и моему коллеге, который действительно привлек мое внимание к этому), что этот код скомпилирован.
Сначала я подумал, что IDisposable.Dispose
каким-то образом преобразуется в совместимый delegate
. Но тогда результат должен быть true
, так как delegate
, разумеется, является сопоставимым с object
.
Заглянув в спецификацию, я обнаружил, что группы методов имеют специальную обработку компилятором (в контексте операции):
Если E - группа методов... результат - false.
Чисто из любопытства, почему это в спецификации? Почему компилятор разрешает это? Почему бы не бросить ошибку времени компиляции (например, для анонимных функций)?
UPDATE:
- Он скомпилирован для меня в VS2013 (12.0.21005.1) и .NET 4.5/4.5.1;
- piojo сообщите нам, что этот код НЕ скомпилирован в Mono (я не могу проверить его сам);
- Он не компилируется для leppie в VS2015 (4.5 или 3.5);
- НЕ скомпилировано под VS2013/12.0.30501.00 обновление 2, цель .NET 4.5.2 (caramiriel);