Почему может не связанный Ссылки на интерфейсы в c # сравнивать без ошибок компилятора?

Недавно я был удивлен, обнаружив, что компилятор явно не строг в отношении сравнения ссылок на интерфейсы, и мне интересно, почему он работает таким образом.

Рассмотрим этот код:

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 конкретного класса.

Что мне не хватает?

13
задан scobi 26 October 2010 в 05:19
поделиться