Недавно я был удивлен, обнаружив, что компилятор явно не строг в отношении сравнения ссылок на интерфейсы, и мне интересно, почему он работает таким образом.
Рассмотрим этот код:
class Program
{
interface I1 {}
interface I2 {}
class C1 : I1 {}
class C2 : I2 {}
static void Main(string[] args)
{
C1 c1 = new C1();
C2 c2 = new C2();
I1 i1 = c1;
I2 i2 = c2;
bool x = c1 == c2;
bool y = i1 == i2;
}
}
Компилятор говорит, что я могу ' t сравните c1 == c2
, которое следует. Типы совершенно не связаны. Тем не менее, это позволяет мне сравнить i1 == i2
. Я ожидал, что здесь произойдет ошибка с ошибкой во время компиляции, но я был удивлен, обнаружив, что вы можете сравнить любой интерфейс с любым другим, и компилятор никогда не будет жаловаться. Я мог бы сравнить, например, (I1) null == (IDisposable) null
и без проблем.
Интерфейсы - это не объекты? Являются ли они особым типом справки? Я ожидал, что ==
приведет либо к прямому сравнению ссылок, либо к вызову виртуального Equals конкретного класса.
Что мне не хватает?