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

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

MSIL, который С# внизу создает для 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"; }
    }
}

Ответы

Ответ 1

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

  • для оптимизации - возможно, это экономит некоторую работу для JIT-компилятора.
  • для удобства чтения - облегчает человеческим глазам понимание того, что тип реализует при просмотре вывода MSIL.
  • потому что то, как летний стажер реализовал его, и так как он отлично работает, никто не собирается его менять на всякий случай, если он что-то сломает.