Статический класс, объявляющий защищенный член - PullRequest
12 голосов
/ 02 июля 2011

Я читаю книгу "Язык C #" и нажимаю на эту заметку Владимира Решетникова:

Если статический класс объявляет защищенный или защищенный внутренний член, aПроизошла ошибка во время компиляции ( CS1057 ).

Могу я узнать почему?Что не так со статическим классом, имеющим защищенный член?Статический класс может иметь закрытый член, поэтому я полагаю, что эта ошибка CS1057 не связана с доступностью, но, возможно, это связано с проблемой компиляции?как защищенный член может быть переопределен в дочерних классах ... но я не мог понять, почему.

Ответы [ 3 ]

16 голосов
/ 02 июля 2011

Поскольку вы не можете наследовать статический класс, protected не имеет смысла - здесь имеют смысл только public и private.

Более подробную информацию можно найти здесь: Почему я не могу наследовать статические классы?

3 голосов
/ 02 июля 2011

Защищенные члены означают, что к ним можно получить доступ из дочерних / производных классов.Но основные характеристики статического класса:

  1. Содержат только статические члены;

  2. Не может быть создан;

  3. запечатаны.

Вот почему статические классы не могут иметь защищенных членов.

0 голосов
/ 21 сентября 2015

Наследование в .NET работает только на базе экземпляров.Статические методы определяются на уровне типа, а не на уровне экземпляра.Вот почему переопределение не работает со статическими методами / свойствами / событиями ...

Статические методы хранятся в памяти только один раз.Для них не существует виртуальной таблицы и т. Д.

Если вы вызываете метод экземпляра в .NET, вы всегда указываете ему текущий экземпляр.Это скрыто во время выполнения .NET, но это происходит.Каждый метод экземпляра имеет в качестве первого аргумента указатель (ссылку) на объект, на котором выполняется метод.Этого не происходит со статическими методами (так как они определены на уровне типа).Как компилятор должен выбрать метод для вызова?

(littleguru)

...