Erreur de chaîne Nullable C #

136
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"];

J'obtiens l'erreur suivante à la déclaration de typeOfContractligne indiquant:

Le type 'string' doit être un type valeur non Nullable pour pouvoir l'utiliser comme paramètre 'T' dans le type ou la méthode générique 'System.Nullable <T>'

Des idées? En gros, je veux m'assurer que cela "type"existe dans le QueryStringavant d'effectuer une action.

Mike Fielden
la source

Réponses:

304

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

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

Joe
la source
13
Une chose à noter: Nullable <T> est un type valeur lui-même, mais la contrainte de type générique "struct" inclut uniquement les types valeur non Nullable - vous ne pouvez donc pas faire Nullable <Nullable <int>>.
Jon Skeet
En C # 8.0, les types de référence peuvent être marqués comme nullables. On peut taper string?pour dire au monde que cette chaîne peut être nulle. Réf: youtube.com/watch?v=VdC0aoa7ung
nkalfov
39

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

sauter
la source
19

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 instruction très valide et il n'est pas nécessaire de la rendre nullable.

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

devrait fonctionner à cause du mot-clé as .

Szymon Rozga
la source
13

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

csgero
la source
4

Pour nullable, utilisez ?avec toutes les primitives C # , à l'exception de string.

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

James Oravec
la source
1
Link is Broken Thanks
Mina Gabriel
Merci Mina, j'ai trouvé un lien différent et mis à jour la référence.
James Oravec
1
Pas seulement les primitives, tous les types de valeur non Nullable (qui ne sont pas gérés spécialement par le .NET) fonctionnent.
IllidanS4 veut que Monica revienne
0

Veuillez noter que dans la prochaine version 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 peut être nul, marquez-le de manière à ce que sinon, attribuer une valeur nulle à non nullable entraînerait un avertissement du compilateur.

Plus d'informations

Pour le 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 à ce moment-là. Puisque vous avez supprimé toutes les réponses, je publie à nouveau 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.

ANewGuyInTown
la source