При попытке скомпилировать мой класс я получаю сообщение об ошибке:
Константа
'NamespaceName.ClassName.CONST_NAME'
не может быть помечена как статическая.
на линии:
public static const string CONST_NAME = "blah";
Я мог бы делать это все время на Java. Что я делаю не так? И почему это не позволяет мне сделать это?
Из спецификации языка C # (страница PDF 287 или 300 страница PDF):
источник
Константный член считается статическим компилятором, а также подразумевает семантику константного значения, что означает, что ссылки на константу могут быть скомпилированы в коде использования в качестве значения константного члена, а не ссылки на член.
Другими словами, член const, содержащий значение 10, может быть скомпилирован в код, который использует его как число 10 вместо ссылки на член const.
Это отличается от статического поля только для чтения, которое всегда будет компилироваться как ссылка на поле.
Обратите внимание, это предварительный JIT. Когда JIT'ter вступает в игру, он может скомпилировать их в целевой код в виде значений.
источник
C # -
const
это то же самое, что и Javafinal
, за исключением того, что это абсолютно всегдаstatic
. На мой взгляд, не обязательно, чтобыconst
переменная была ненулевойstatic
, но если вам нуженconst
не-static
единственный доступ к переменной , вы можете сделать:Что ж, теперь я понимаю, что этот вопрос задавался 4 года назад, но, поскольку я потратил около 2 часов работы, состоящей из попыток различных способов ответа и форматирования кода, в этот ответ, я все еще публикую его. :)
Но, к сведению, я все еще чувствую себя немного глупо.
источник
final
ведет себя точно так же, как C #readonly
, и совсем не такconst
.Из MSDN: http://msdn.microsoft.com/en-us/library/acdd6hb7.aspx
... Кроме того, хотя поле const является константой времени компиляции , поле readonly может использоваться для констант времени выполнения ...
Таким образом, использование static в полях const похоже на попытку сделать определенный (с помощью #define) static в C / C ++ ... Поскольку он заменяется своим значением во время компиляции, конечно, он инициируется один раз для всех экземпляров (= static) ,
источник
const похож на static, мы можем получить доступ к обоим объектам с именем класса, но diff - это статические переменные, которые можно изменить, а const - нет.
источник