web-dev-qa-db-fra.com

Erreur de chaîne nullable en C #

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

Plus tard dans le code, je l'utilise comme ceci:

typeOfContract = Request.QueryString["type"];

Je reçois l'erreur suivante lors de la déclaration de la ligne typeOfContract:

Le type 'chaîne' doit être un type de valeur non nullable pour pouvoir être utilisé comme paramètre 'T' dans le type générique ou la méthode 'System.Nullable <T>'

Des idées? En gros, je veux m'assurer que "type" existe dans QueryString avant d’effectuer une action.

136
Mike Fielden

System.String est un type de référence et déjà "nullable".

Nullable <T> et le? Les suffixes sont pour les types de valeur tels que Int32, Double, DateTime, etc.

304
Joe

Tu compliques les choses. string est déjà nullable. Vous n'avez pas besoin de le rendre plus nullable. Sortez le ? sur le type de propriété.

39
jop

string ne peut pas être le paramètre à Nullable car string n'est pas un type valeur. String est un type de référence.

string s = null; 

est une déclaration très valide et il n’est pas nécessaire de la rendre nulle.

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

devrait fonctionner à cause du mot clé as.

19
Szymon Rozga

String est un type de référence, vous n'avez donc pas besoin (et ne pouvez pas) utiliser Nullable<T> ici. Il suffit de déclarer typeOfContract en tant que chaîne et de simplement vérifier la valeur null après l'avoir extraite de la chaîne de requête. Ou utilisez String.IsNullOrEmpty si vous souhaitez gérer des valeurs de chaîne vides identiques à null.

13
csgero

Pour nullable, utilisez ? avec toutes les C # primitives , sauf pour chaîne.

La page suivante donne une liste des primitives C # : http://msdn.Microsoft.com/en-us/library/aa711900 (v = vs.71) .aspx

4
James Oravec

Veuillez noter que dans la version à venir de C # qui est 8, les réponses ne sont pas vraies.

All the reference types are non-nullable by default et vous pouvez réellement faire ce qui suit:

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

Cependant,

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

L'important ici est de montrer l'intention de votre code. Si "l'intention" est que le type de référence puisse être null, alors marquez-le pour qu'il en soit autrement. attribuer une valeur null à non-nullable entraînerait un avertissement du compilateur.

Plus d'infos

Au modérateur qui supprime toutes les réponses, ne le faites pas. Je crois fermement que cette réponse ajoute de la valeur et que la suppression empêcherait simplement quelqu'un de savoir ce qui est juste à l'époque. Puisque vous avez supprimé toutes les réponses, je vous repasse la réponse ici. Le lien qui a été envoyé concernant les "doublons" est simplement une ouverture de certaines personnes et je ne pense pas que ce soit une recommandation officielle.

0
ANewGuyInTown