Почему компилятор C# явно объявляет все интерфейсы, реализуемые типом?

Компилятор С#, кажется, явно отмечает все интерфейсы, которые он реализует, и реализует его базовые классы. Спецификации CLI говорят, что это не обязательно. Я видел, что некоторые другие компиляторы не выдают это явно, и, похоже, это работает нормально. Есть ли какая-то разница или причина, по которой С# делает это?

MSIL, который C# внизу генерирует для B:

.class private auto ansi beforefieldinit B
       extends A
       implements IAdvanced,
                  ISimple

Не нужно указывать ISimple, потому что A реализует его так же, как и IAdvanced. Код С#:

interface ISimple {
    int Basic { get;  }
    int Zero { get;  }
}
interface IAdvanced : ISimple {
    string Major { get; }
}
class A : ISimple {
    int ISimple.Basic {
        get { return 1; }
    }
    int ISimple.Zero {
        get{ return 0;}
    }
}
class B : A, IAdvanced {
    string IAdvanced.Major {
        get { return "B"; }
    }
}

person MichaelGG    schedule 17.04.2009    source источник


Ответы (1)


Я не думаю, что мы можем получить здесь какой-либо окончательный ответ, если только к нам не заглянут разработчики компилятора. Однако мы можем догадаться о причинах. Возможно:

  1. для оптимизации - возможно, это сэкономит часть работы JIT-компилятору.
  2. для удобочитаемости — облегчает человеческому глазу понимание того, что реализует тип при просмотре вывода MSIL.
  3. потому что именно так это реализовал летний стажер, и поскольку он работает нормально, никто не собирается его менять на случай, если он что-то сломает.
person Sander    schedule 17.04.2009
comment
IIRC, все четко определено в спецификации. Так что тут не угадаешь. - person leppie; 17.04.2009
comment
Я бы пошел к двери номер три! ;-) - person peSHIr; 17.04.2009
comment
Да, раздел II спецификаций CLI ясно дает понять, что это не требуется. Я не видел, сказано ли, что добавление действительно что-то делает. - person MichaelGG; 17.04.2009