Рассмотрим следующие типы:
class A { }
class B { }
interface IC { }
A a = null; // the value doesn't matter - null or anything else, for all three
B b = null;
IC c = null;
Следующий делает не компиляцию:
var x = a == b;
Но следующий делает компиляцию (как я с удивлением обнаружил):
var x = a == c;
Как я понимаю, компилятор возвращается к использованию оператора по умолчанию ==, который определен на объекте и таким образом принимает любой тип для своих аргументов. IL выглядит так (игнорируйте детали ldfld
):
ldarg.0
ldfld class A a
ldarg.0
ldfld class IC c
ceq
stloc.0
Другими словами, он использует ссылочное равенство.
Мои вопросы:
-
Что касается дизайна языка, почему это имеет смысл? Для меня это не так, и я считаю это большой ловушкой.
-
Если это действительно ошибка, не следует ли нам анализировать Code Analysis? (нет - это не так). Кстати, У ReSharper есть эта функция.