C # nullable string error

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

Später im Code benutze ich es so:

typeOfContract = Request.QueryString["type"];

Bei der Zeilenerklärung wird folgende Fehlermeldung typeOfContractangezeigt:

Der Typ 'string' muss ein nicht nullbarer Werttyp sein, um ihn als Parameter 'T' im generischen Typ oder in der generischen Methode 'System.Nullable <T>' zu verwenden.

Irgendwelche Ideen? Grundsätzlich möchte ich sicherstellen, dass "type"in der vorhanden ist, QueryStringbevor eine Aktion ausgeführt wird.

Mike Fielden
quelle

Antworten:

304

System.String ist ein Referenztyp und bereits "nullbar".

Nullable <T> und das? Suffixe sind für Werttypen wie Int32, Double, DateTime usw.

Joe
quelle
13
Beachten Sie Folgendes: Nullable <T> ist selbst ein Werttyp, aber die generische Typeinschränkung "struct" enthält nur nicht nullbare Werttypen. Sie können also nicht Nullable <Nullable <int>> ausführen.
Jon Skeet
In C # 8.0 können Referenztypen als nullwertfähig markiert werden. Man kann eingeben string?, um der Welt mitzuteilen, dass diese Zeichenfolge null sein kann. Ref: youtube.com/watch?v=VdC0aoa7ung
nkalfov
39

Du machst es kompliziert. stringist bereits nullbar. Sie brauchen nicht zu machen mehr nullable. Nehmen Sie den ?auf dem Grundstück befindlichen Typ heraus.

jop
quelle
19

Zeichenfolge kann nicht der Parameter für Nullable sein, da Zeichenfolge kein Werttyp ist. String ist ein Referenztyp.

string s = null; 

ist eine sehr gültige Aussage und muss nicht null gemacht werden.

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

sollte wegen des Schlüsselworts as funktionieren .

Szymon Rozga
quelle
13

String ist ein Referenztyp, daher müssen (und können) Sie ihn Nullable<T>hier nicht verwenden . Deklarieren Sie einfach typeOfContract als Zeichenfolge und suchen Sie einfach nach null, nachdem Sie es aus der Abfragezeichenfolge abgerufen haben. Oder verwenden Sie String.IsNullOrEmpty, wenn Sie leere Zeichenfolgenwerte wie null behandeln möchten.

csgero
quelle
4

Verwenden Sie für nullable ?alle C # -Primitive mit Ausnahme der Zeichenfolge.

Die folgende Seite enthält eine Liste der C # -Primitive : http://msdn.microsoft.com/en-us/library/aa711900(v=vs.71).aspx

James Oravec
quelle
1
Link ist gebrochen Danke
Mina Gabriel
Danke Mina, ich habe einen anderen Link gefunden und die Referenz aktualisiert.
James Oravec
1
Nicht nur Grundelemente, sondern alle nicht nullbaren Werttypen (die von .NET nicht speziell behandelt werden) funktionieren.
IllidanS4 will Monica
0

Bitte beachten Sie, dass in der kommenden Version von C #, die 8 ist, die Antworten nicht wahr sind.

All the reference types are non-nullable by default und Sie können tatsächlich Folgendes tun:

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

Jedoch,

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

Das Wichtigste hier ist, die Absicht Ihres Codes zu zeigen. Wenn die "Absicht" ist, dass der Referenztyp null sein kann, markieren Sie ihn, damit die Zuweisung eines Nullwerts zu einem nicht nullbaren Wert zu einer Compilerwarnung führen würde.

Mehr Info

Tun Sie es dem Moderator, der alle Antworten löscht, nicht. Ich bin der festen Überzeugung, dass diese Antwort einen Mehrwert bietet und das Löschen einfach jemanden davon abhält, zu wissen, was gerade richtig ist. Da Sie alle Antworten gelöscht haben, poste ich die Antwort hier erneut. Der Link, der bezüglich "Duplikate" gesendet wurde, ist einfach eine Öffnung für einige Leute und ich denke nicht, dass es eine offizielle Empfehlung ist.

ANewGuyInTown
quelle