C # błąd ciągu dopuszczającego wartość null

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

W dalszej części kodu używam go w ten sposób:

typeOfContract = Request.QueryString["type"];

Otrzymuję następujący błąd w deklaracji typeOfContractlinii stwierdzającej:

Typ „string” musi być typem wartości niepodlegającym wartości null, aby można go było użyć jako parametru „T” w typie ogólnym lub metodzie „System.Nullable <T>”

Jakieś pomysły? Zasadniczo chcę się upewnić, że "type"istnieje w QueryStringprzed wykonaniem akcji.

Mike Fielden
źródło

Odpowiedzi:

304

System.String jest typem referencyjnym i już dopuszcza wartość null.

Nullable <T> i? sufiks dotyczy typów wartości, takich jak Int32, Double, DateTime itp.

Joe
źródło
13
Należy zwrócić uwagę na jedną rzecz: Nullable <T> jest samym typem wartości, ale ograniczenie typu ogólnego „struct” obejmuje tylko typy wartości niepodlegające wartości null - więc nie można wykonać Nullable <Nullable <int>>.
Jon Skeet
W C # 8.0 typy odwołań mogą być oznaczone jako dopuszczające wartość null. Można napisać, string?aby powiedzieć światu, że ten ciąg może być pusty. Ref: youtube.com/watch?v=VdC0aoa7ung
nkalfov
39

Komplikujesz to. stringjest już dopuszczalna wartość null. Nie musisz zwiększać wartości null. Wyjmij ?typ nieruchomości.

jop
źródło
19

ciąg nie może być parametrem dopuszczającym wartość Nullable, ponieważ ciąg nie jest typem wartości. Ciąg jest typem referencyjnym.

string s = null; 

jest bardzo poprawną instrukcją i nie ma potrzeby nadawania jej wartości null.

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

powinno działać ze względu na słowo kluczowe as .

Szymon Rozga
źródło
13

Ciąg jest typem referencyjnym, więc nie musisz (i nie możesz) go Nullable<T>tutaj używać . Po prostu zadeklaruj typeOfContract jako ciąg i po prostu sprawdź wartość null po pobraniu go z ciągu zapytania. Lub użyj String.IsNullOrEmpty, jeśli chcesz obsługiwać puste wartości ciągów tak samo, jak null.

csgero
źródło
4

Aby uzyskać wartość null, użyj ?ze wszystkimi prymitywami C # , z wyjątkiem string.

Poniższa strona zawiera listę prymitywów języka C # : http://msdn.microsoft.com/en-us/library/aa711900(v=vs.71).aspx

James Oravec
źródło
1
Link jest zepsuty Dzięki
Mina Gabriel
Dzięki Mina, znalazłem inny link i zaktualizowałem odniesienie.
James Oravec
1
Nie tylko prymitywy, działają wszystkie typy wartości niepodlegające wartości null (które nie są obsługiwane specjalnie przez .NET).
IllidanS4 chce, aby Monica wróciła
0

Zwróć uwagę, że w nadchodzącej wersji C # 8, odpowiedzi nie są prawdziwe.

All the reference types are non-nullable by default i faktycznie możesz wykonać następujące czynności:

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

Jednak,

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

Ważne jest tutaj pokazanie intencji twojego kodu. Jeśli „intencją” jest to, że typ referencyjny może mieć wartość null, zaznacz go, aby w przeciwnym razie przypisanie wartości null do wartości nie dopuszczającej wartości null spowodowałoby ostrzeżenie kompilatora.

Więcej informacji

Moderatorowi, który usuwa wszystkie odpowiedzi, nie rób tego. Jestem głęboko przekonany, że ta odpowiedź jest wartościowa, a jej usunięcie po prostu uniemożliwiłoby komuś poznanie tego, co jest w danym momencie właściwe. Ponieważ wszystkie odpowiedzi zostały usunięte, ponownie zamieszczam odpowiedź tutaj. Link, który został wysłany w sprawie „duplikatów”, jest po prostu otwarciem niektórych osób i nie sądzę, by było to oficjalna rekomendacja.

ANewGuyInTown
źródło