Защищенные структуры в статических классах

#c# #struct #static #protected

Вопрос:

В C# это :

 static class foo
{
    protected void doThing(); // CS1057
    {

    }
}
 

Генерирует ошибку компилятора CS1057, так как статические классы не поддерживают наследование.

Так почему же это разрешено? Каково значение protected ключевого слова в этом контексте?

 static class foo
{
    protected struct bar
    {

    }
}
 

Комментарии:

1. Интересно — я получаю ошибку компилятора в .NET 4.7.2, но не в .NET 5 или Roslyn. Интересно, это ошибка компилятора или новая функция?

2. у меня есть версия моего языка, установленная в «предварительном просмотре» в csproj. Возможно, у меня ошибка с языком, так как я тоже использую .NET Framework 4.7.2

3. Может быть, кто-нибудь объяснит, почему меня это должно волновать? В c# и VS есть много гораздо более интересных и важных сотрудников.

4. в связи с тем, что VS2019 выдает много ошибок, когда я пытаюсь работать с этим кодом, я бы сказал, что, скорее всего, это ошибка)

Ответ №1:

Это определенно ошибка, и я бы посоветовал вам ее исправить.


ECMA-334, официальная спецификация для C#, гласит следующее

15.2.2.4 Статические классы
15.2.2.4.1 Общие положения

…снип…
На объявление статического класса распространяются следующие ограничения:

  • …снип…
  • Статический класс не должен иметь членов с protected или protected internal объявленной доступностью.

Не говорите мне, что это исключает вложенные типы, потому что несколькими строками позже вложенные типы специально исключаются из static ограничений модификатора:

Члены статического класса не являются автоматически статическими, и объявления членов должны явно включать static модификатор (за исключением констант и вложенных типов).