Почему nullables не могут быть объявлены const? - PullRequest
14 голосов
/ 02 декабря 2009
[TestClass]
public class MsProjectIntegration {
    const int? projectID = null;
    // The type 'int?' cannot be declared const
    // ...
}

Почему я не могу иметь const int??

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

Ответы [ 5 ]

20 голосов
/ 02 декабря 2009

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

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

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

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

Это:

private const decimal TheAnswer = 42;

... компилирует (ну, Рефлекторы) в это:

[DecimalConstant(0, 0, (uint) 0, (uint) 0, (uint) 42)]
private static readonly decimal TheAnswer;
13 голосов
/ 02 декабря 2009

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

Константы должны быть целого типа (sbyte, byte, short, ushort, int, Uint, Long, Ulong, полукокса, поплавок, double, decimal, bool или string), перечисление или ссылка на ноль.

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

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

8 голосов
/ 02 декабря 2009

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

Вы можете пометить его как только для чтения

readonly int? projectID = null;

Тогда его нельзя изменить вне конструкторов классов.

3 голосов
/ 02 декабря 2009

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

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

С логической точки зрения ... само объявление не имеет смысла.

3 голосов
/ 02 декабря 2009

Возможно, вы захотите использовать вместо этого модификатор «только для чтения».

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

...