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.

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.


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.


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 .


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.


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


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.