Почему я не могу использовать String.Empty в качестве значения параметра по умолчанию?

Сегодня я создавал значение параметра по умолчанию в конструкторе.

public SomeClass (String something = String.Empty)
{
   // ...
}

Компилятор пожаловался.

Значение параметра по умолчанию для "что-то" должно быть константой времени компиляции.

У меня сложилось впечатление, что Empty в классе String была константой времени компиляции.

.field public static initonly string Empty

Я неправильно понимаю значение константы времени компиляции, или мне просто нужно принять больше глупостей?

3 ответа

Решение

Принятый ответ на этот вопрос. Почему String.Empty не является константой? является:

Причина использования статического readonly вместо const заключается в том, что он используется с неуправляемым кодом, как указано Microsoft здесь, в общеязыковой версии 2.0 общедоступной инфраструктуры. Файл для просмотра - это sscli20\clr\src\bcl\system\string.cs.

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

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

Я нашел эту информацию из этой удобной статьи в CodeProject.

static readonly поле не является константой времени компиляции. Это просто статическое поле, которое не должно изменяться после завершения инициализации класса.

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

Ты можешь использовать "" вместо этого, который как строковый литерал является константой времени компиляции.

readonly Поле является постоянной времени выполнения. Он не будет привязан к значению до объекта (или класса, если поле static) инициализируется.

Константы времени компиляции являются литералами (такими как "" - что по сути то же самое, что и String.Emptyво всяком случае) и прочее const,

Другие вопросы по тегам