Константа не может быть помечена как статическая

Я пытаюсь объявить константу PI следующим образом:

public static const double PI = Math.PI;

но почему я получаю эту ошибку?

The constant 'Calendar.NewCalendar.PI' cannot be marked static

Ответ 1

const означает static (вам не нужен экземпляр для ссылки на значение const).

Я хочу также добавить этот важный момент: когда вы ссылаетесь на (ссылку) на сборку с public const, это значение скопировано в вашу сборку. Поэтому, если значение const в указанной сборке изменяется, ваша сборка будет по-прежнему иметь исходное скомпилированное значение.

Если это поведение неприемлемо, вам следует подумать о создании поля a public static readonly.

Lib.dll, представленный как двоичный:

public class Foo {
    public const int HATS = 42;
    public static readonly int GLOVES = 33;
}

App.exe, ссылки Lib.dll:

Foo.HATS    // This will always be 42 even if the value in Lib.dll changes,
            // unless App.exe is recompiled.

Foo.GLOVES  // This will always be the same as Foo.GLOVES in Lib.dll

От MSDN:

Не создавайте константу для представления информации, которую вы ожидаете изменить в любое время. Например, не используйте постоянное поле для хранения цены на услугу, номер версии продукта или фирменное наименование компании. Эти значения могут меняться со временем, а поскольку компиляторы распространяют константы, другой код, скомпилированный с вашими библиотеками, должен быть перекомпилирован для просмотра изменений.

От DotNetPerls:

библиотеки DLL. Когда вы используете поле или объявление const, компилятор С# фактически вводит значение переменной const непосредственно в код IL. Поэтому он по существу стирает const как отдельный объект.

Внимание: Если программы, зависящие от const, не перекомпилируются после изменения значения const, они могут сломаться [потому что они будут продолжать использовать предыдущее значение].

Ответ 2

Константа по определению статична.

Ответ 3

У вас не может быть static const. Попробуйте readonly вместо const или просто отбросьте "static", так как "const" все равно подразумевается как статический.

Ответ 4

Константы не могут быть заменены в коде во время компиляции, а не во время выполнения, поэтому нет необходимости в определении статических vs-экземпляров.

Ответ 5

Все объявления констант неявно статичны, а спецификация С# заявляет, что включение (резервирование) статического модификатора запрещено. Я считаю, что это необходимо для того, чтобы избежать путаницы, которая могла возникнуть, если бы читатель увидел две константы, один из которых был объявлен статичным, а другой нет - они могли легко предположить, что разница в спецификации подразумевала разницу в семантике. Сказав это, нет запрета на избыточное определение модификатора доступа, который также является стандартным, где есть выбор. Например, метод (конкретный) может быть явно помечен как закрытый, несмотря на то, что это значение по умолчанию. Правило, по-видимому, заключается в том, что там, где нет выбора (например, объявление метода в интерфейсе), избыточный модификатор запрещен. Там, где есть выбор, его разрешено.