Почему компилятор С# явно объявляет все интерфейсы, которые реализует тип?
Компилятор С# явно явно отмечает все интерфейсы, которые он использует, и его базовые классы реализуют. Спецификации 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.
- потому что то, как летний стажер реализовал его, и так как он отлично работает, никто не собирается его менять на всякий случай, если он что-то сломает.