Errore stringa nulla C #


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

Più avanti nel codice lo uso così:

typeOfContract = Request.QueryString["type"];

Ricevo il seguente errore nella dichiarazione di typeOfContractriga che dichiara:

Il tipo 'stringa' deve essere un tipo di valore non annullabile per poterlo utilizzare come parametro 'T' nel tipo o metodo generico 'System.Nullable <T>'

Qualche idea? Fondamentalmente, voglio assicurarmi che "type"esista QueryStringprima di eseguire un'azione.

Risposte:


304

System.String è un tipo di riferimento e già "nullable".

Nullable <T> e il? i suffissi sono per tipi di valore come Int32, Double, DateTime, ecc.


13
Una cosa da notare: Nullable <T> è un tipo di valore stesso, ma il vincolo di tipo generico "struct" include solo tipi di valore non annullabili, quindi non è possibile eseguire Nullable <Nullable <int>>.
Jon Skeet,

In C # 8.0 i tipi di riferimento possono essere contrassegnati come nullable. Si può scrivere string?per dire al mondo che questa stringa può essere nulla. Rif: youtube.com/watch?v=VdC0aoa7ung
nkalfov

39

Lo stai complicando. stringè già nullable. Non è necessario renderlo più annullabile. Elimina ?il tipo di proprietà.


19

stringa non può essere il parametro su Nullable perché stringa non è un tipo di valore. String è un tipo di riferimento.

string s = null; 

è una dichiarazione molto valida e non è necessario renderla nullable.

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

dovrebbe funzionare a causa della parola chiave as .


13

String è un tipo di riferimento, quindi non è necessario (e non è possibile) utilizzarlo Nullable<T>qui. Dichiarare typeOfContract come stringa e controllare semplicemente null dopo averlo ottenuto dalla stringa di query. Oppure utilizzare String.IsNullOrEmpty se si desidera gestire valori stringa vuoti come null.


4

Per nullable, utilizzare ?con tutte le primitive C # , ad eccezione di stringa.

La seguente pagina fornisce un elenco delle primitive C # : http://msdn.microsoft.com/en-us/library/aa711900(v=vs.71).aspx


1
Collegamento interrotto Grazie
Mina Gabriel,

Grazie Mina, ho trovato un link diverso e ho aggiornato il riferimento.
James Oravec,

1
Non solo le primitive, tutti i tipi di valore non annullabili (che non sono gestiti appositamente da .NET) funzionano.
IllidanS4 vuole che Monica torni il

0

Si noti che nella prossima versione di C # che è 8, le risposte non sono vere.

All the reference types are non-nullable by default e puoi effettivamente fare quanto segue:

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

Però,

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

L'importante qui è mostrare l'intento del tuo codice. Se "l'intento" è che il tipo di riferimento può essere nullo, quindi contrassegnarlo in modo che l'assegnazione di un valore null a non annullabile comporterebbe un avviso del compilatore.

Ulteriori informazioni

Al moderatore che sta eliminando tutte le risposte, non farlo. Sono fermamente convinto che questa risposta abbia un valore aggiunto e l'eliminazione impedirebbe semplicemente a qualcuno di sapere cosa è giusto al momento. Dato che hai eliminato tutte le risposte, sto postando di nuovo la risposta qui. Il link che è stato inviato per quanto riguarda i "duplicati" è semplicemente un'apertura di alcune persone e non credo che sia una raccomandazione ufficiale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.