Почему компилятор C # явно объявляет все интерфейсы, которые реализует тип? - PullRequest
14 голосов
/ 17 апреля 2009

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

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

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

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

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 Ответ

8 голосов
/ 17 апреля 2009

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

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