Почему я не могу использовать "public static const string S =" stuff ", в моем классе?

При попытке скомпилировать мой класс я получаю сообщение об ошибке:

Константа 'NamespaceName.ClassName.CONST_NAME' не может быть помечена как статическая.

в строке:

public static const string CONST_NAME = "blah";

Я мог бы делать это все время в Java. Что я делаю не так? И почему это не позволяет мне это делать?

Ответ 1

A const объект всегда static.

Ответ 2

Из спецификация языка С# (PDF страница 287 - или 300-я страница PDF):

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

Ответ 3

Элемент const считается статическим компилятором, а также подразумевает семантику постоянного значения, что означает, что ссылки на константу могут быть скомпилированы в код использования в качестве значения константного элемента вместо ссылки на элемент.

Другими словами, член const, содержащий значение 10, может быть скомпилирован в код, который использует его как число 10 вместо ссылки на член const.

Это отличается от статического поля readonly, которое всегда будет скомпилировано как ссылка на поле.

Обратите внимание, что это pre-JIT. Когда JIT'ter входит в игру, он может скомпилировать оба эти кода в целевой код как значения.

Ответ 4

С# const - это то же самое, что и Java final, за исключением абсолютно всегда static. На мой взгляд, не обязательно, чтобы переменная const была не static, но если вам нужно получить доступ к переменной const не static -ly, вы можете сделать:

class MyClass
{    
    private const int myLowercase_Private_Const_Int = 0;
    public const int MyUppercase_Public_Const_Int = 0;

    /*        
      You can have the `private const int` lowercase 
      and the `public int` Uppercase:
    */
    public int MyLowercase_Private_Const_Int
    {
        get
        {
            return MyClass.myLowercase_Private_Const_Int;
        }
    }  

    /*
      Or you can have the `public const int` uppercase 
      and the `public int` slighly altered
      (i.e. an underscore preceding the name):
    */
    public int _MyUppercase_Public_Const_Int
    {
        get
        {
            return MyClass.MyUppercase_Public_Const_Int;
        }
    } 

    /*
      Or you can have the `public const int` uppercase 
      and get the `public int` with a 'Get' method:
    */
    public int Get_MyUppercase_Public_Const_Int()
    {
        return MyClass.MyUppercase_Public_Const_Int;
    }    
}

Итак, теперь я понимаю, что этот вопрос был задан 4 года назад, но так как я потратил около 2 часов работы, состоящий в попытке использовать всевозможные способы ответа и форматирования кода, в этот ответ я все еще размещаю его,:)

Но, для записи, я все еще чувствую себя глупо.

Ответ 5

Из MSDN: http://msdn.microsoft.com/en-us/library/acdd6hb7.aspx

... Кроме того, хотя поле const является константой времени компиляции, поле readonly может использоваться для констант времени выполнения...

Таким образом, использование static в const-полях похоже на попытку сделать определенный (С#define) статичным в C/С++... Так как он заменяется его значением во время компиляции, то он запускается один раз для всех экземпляров ( = статический).

Ответ 6

const похож на статический, мы можем обращаться к обеим переменным с именем класса, но diff статические переменные могут быть изменены, а const не может.