Почему нельзя объявлять недействительные константы?

[TestClass]
public class MsProjectIntegration {
    const int? projectID = null;
    // The type 'int?' cannot be declared const
    // ...
}

Почему я не могу использовать const int??

Изменить:. Причина, по которой я хотел иметь значение null с именем int, это потому, что я просто использую его для загрузки некоторых данных из базы данных. Если он null, я просто собирался инициализировать образцы данных во время выполнения. Это действительно быстрый тестовый проект, и, очевидно, я мог бы использовать 0 или -1, но int? просто чувствовал себя как правильная структура данных для того, что я хотел сделать. readonly похоже на путь

Ответы

Ответ 1

Это не только nullables; только типы, встроенные в среду выполнения, могут быть объявлены const (из памяти, bools, различных типов int, float/double и строк).

Почему? Поскольку значение встраивается непосредственно в сборку во время компиляции, и нет возможности встраивать определяемые пользователем типы.

Ключевое слово readonly должно делать то, что вам нужно. В отличие от const, любые поля readonly инициализируются во время выполнения, а не времени компиляции, поэтому их можно инициализировать с помощью более или менее любого выражения, которое вы хотите.

Изменить:, как указывает Эрик Липперт, это не так просто. Например, const decimal работает.

Это:

private const decimal TheAnswer = 42;

... компилирует (ну, отражатели):

[DecimalConstant(0, 0, (uint) 0, (uint) 0, (uint) 42)]
private static readonly decimal TheAnswer;

Ответ 2

http://en.csharp-online.net/const,_static_and_readonly

Константы должны быть целочисленного типа (sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, bool или string), перечисление или ссылку на нуль.

Так как классы или структуры инициализируется во время выполнения с новым ключевое слово, а не во время компиляции, вы не может установить константу в класс или структура.

Поскольку nullable является структурой, приведенная выше цитата является причиной.

Ответ 3

У вас не может быть тип ссылки const (или struct), поэтому вы не можете иметь const int? который на самом деле просто Nullable<int>.

Вы можете пометить его как readonly

readonly int? projectID = null;

Затем он не может быть изменен вне конструкторов классов.

Ответ 4

Вместо этого вы можете захотеть использовать модификатор "readonly".

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

Ответ 5

В основном вы говорите:

У меня есть класс с полем projectId которые могут иметь или не иметь ценности, но что на самом деле НИКОГДА не имеет значения, это всегда undefined.

С логической точки зрения... сама декларация не имеет смысла.