Я запустил проект с открытым исходным кодом в прошлый уик-энд, когда я наткнулся на немного кода, который смутил меня, чтобы найти использование в спецификации С#.
Код в вопросах выглядит следующим образом:
internal static class SomeStaticClass
{
private const int CommonlyUsedValue = 42;
internal static string UseCommonlyUsedValue(...)
{
// some code
value = CommonlyUsedValue + ...;
return value.ToString();
}
}
Я был застигнут врасплох, потому что это, как представляется, не статическое поле, используемое статической функцией, которая некорректно компилируется в статическом классе!
В спецификации указано (§10.4):
Объявление константы может включать набор атрибутов (§17), новый (§10.3.4) и действительным сочетание четырех модификаторов (§10.3.5). Атрибуты и модификаторы применяются ко всем членов, объявленных постоянная декларация. Хотя константы считаются статическими членов, декларация констант ни требует, ни статического модификатор.. Это ошибка для того же модификатор появится несколько раз в константная декларация.
Итак, теперь это имеет немного больше смысла, потому что константы считаются статическими членами, но остальная часть предложения немного удивляет меня. Почему константная декларация не требует и не допускает статического модификатора? По общему признанию, я не знал, что спецификация достаточно хорошо для этого, чтобы сразу иметь смысл в первую очередь, но почему было принято решение не форсировать константы для использования статического модификатора, если они считаются статическими?
Глядя на последнее предложение в этом параграфе, я не могу понять, относится ли оно к предыдущему утверждению напрямую, и для начала существует какой-то неявный статичный модификатор на константах или если он сам по себе является другим правилом для констант. Может ли кто-нибудь помочь мне прояснить это?