#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
модификатор (за исключением констант и вложенных типов).