C # ошибка строки, допускающей значение NULL

136
private string? typeOfContract
{
  get { return (string?)ViewState["typeOfContract"]; }
  set { ViewState["typeOfContract"] = value; }
}

Позже в коде я использую это так:

typeOfContract = Request.QueryString["type"];

Я получаю следующую ошибку при объявлении typeOfContractстроки:

Тип 'string' должен быть типом значения, не допускающим значения NULL, чтобы использовать его в качестве параметра 'T' в универсальном типе или методе 'System.Nullable <T>'

Любые идеи? По сути, я хочу убедиться, что он "type"существует в QueryStringперед выполнением действия.

Майк Филден
источник

Ответы:

304

System.String является ссылочным типом и уже допускает значение NULL.

Обнуляемый <T> и? суффикс для типов значений, таких как Int32, Double, DateTime и т. д.

Джо
источник
13
Одно замечание: Nullable <T> сам является типом значения, но ограничение универсального типа «struct» включает только типы значений, не допускающие значения NULL, поэтому вы не можете использовать Nullable <Nullable <int>>.
Джон Скит,
В C # 8.0 ссылочные типы могут быть помечены как допускающие значение NULL. Можно ввести, string?чтобы сказать миру, что эта строка может быть нулевой. Ссылка: youtube.com/watch?v=VdC0aoa7ung
nkalfov 04
39

Вы усложняете это. stringуже допускает значение NULL. Вам не нужно делать его более допускающим значение NULL. Выньте ?на тип недвижимости.

Jop
источник
19

string не может быть параметром Nullable, поскольку строка не является типом значения. Строка - это ссылочный тип.

string s = null; 

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

private string typeOfContract
    {
      get { return ViewState["typeOfContract"] as string; }
      set { ViewState["typeOfContract"] = value; }
    }

должен работать из-за ключевого слова as .

Шимон Розга
источник
13

String - это ссылочный тип, поэтому вам не нужно (и нельзя) использовать Nullable<T>здесь. Просто объявите typeOfContract как строку и просто проверьте значение null после получения его из строки запроса. Или используйте String.IsNullOrEmpty, если вы хотите обрабатывать пустые строковые значения так же, как null.

csgero
источник
4

Для значений NULL используйте ?со всеми примитивами C # , кроме строки.

На следующей странице представлен список примитивов C # : http://msdn.microsoft.com/en-us/library/aa711900(v=vs.71).aspx

Джеймс Оравек
источник
1
Link is Broken Спасибо
Мина Габриэль
Спасибо, Мина, я нашел другую ссылку и обновил ссылку.
Джеймс Оравек
1
Работают не только примитивы, но и все типы значений, не допускающие значения NULL (которые не обрабатываются .NET специально).
IllidanS4 поддерживает Монику
1

Обратите внимание, что в следующей версии C # 8, ответы неверны.

All the reference types are non-nullable by default и вы действительно можете сделать следующее:

public string? MyNullableString; 
this.MyNullableString = null; //Valid

Однако,

public string MyNonNullableString; 
this.MyNonNullableString = null; //Not Valid and you'll receive compiler warning. 

Здесь важно показать цель вашего кода. Если «намерение» состоит в том, что ссылочный тип может иметь значение NULL, отметьте его, иначе присвоение значения NULL для значения, не допускающего значения NULL, приведет к предупреждению компилятора.

Больше информации

Модератору, который удаляет все ответы, не делайте этого. Я твердо верю, что этот ответ добавляет ценности, а удаление просто помешает кому-то узнать, что в данный момент является правильным. Поскольку вы удалили все ответы, я повторно отправляю ответ здесь. Ссылка, которая была отправлена ​​относительно «дубликатов», является просто открытием некоторых людей, и я не думаю, что это официальная рекомендация.

ANewGuyInTown
источник