Я пытаюсь объявить константу PI следующим образом:
public static const double PI = Math.PI;
но почему я получаю эту ошибку?
The constant 'Calendar.NewCalendar.PI' cannot be marked static
Я пытаюсь объявить константу PI следующим образом:
public static const double PI = Math.PI;
но почему я получаю эту ошибку?
The constant 'Calendar.NewCalendar.PI' cannot be marked static
Ответы:
constподразумевает static(вам не нужен экземпляр для ссылки на constзначение).
Я также хочу добавить этот важный момент: когда вы связываете (ссылаетесь) на сборку с помощью public const, это значение копируется в вашу сборку. Поэтому, если constзначение в указанной сборке изменится, ваша сборка все равно будет иметь изначально скомпилированное значение.
Если такое поведение не приемлемо, то вам следует рассмотреть вопрос о внесении поля в 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поле или объявление, компилятор C # фактически встраивает значениеconstпеременной непосредственно в код IL. Следовательно, он по существу стираетconstкак отдельный объект.Предупреждение: Если программы, зависящие от a
const, не будут перекомпилированы послеconstизменения значения, они могут выйти из строя [ потому что они будут продолжать использовать предыдущее значение ].
Константа статична по определению.
Константы нельзя заменить в коде во время компиляции, а не во время выполнения, поэтому нет необходимости в определениях статических и экземпляров.
Все объявления констант неявно статичны, а в спецификации C # указано, что (избыточное) включение модификатора static запрещено. Я считаю, что это сделано для того, чтобы избежать путаницы, которая могла бы возникнуть, если бы читатель увидел две константы, одну объявленную статической, а другую нет - они могли легко предположить, что разница в спецификации подразумевает различие в семантике. При этом нет запрета на избыточное указание модификатора доступа, который также является модификатором по умолчанию, где есть выбор. Например, (конкретный) метод может быть явно помечен как частный, несмотря на то, что он установлен по умолчанию. Кажется, что правило заключается в том, что там, где нет выбора (например, объявление метода в интерфейсе), избыточный модификатор запрещен. Там, где есть выбор, он разрешен.