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

172

Pourquoi j'obtiens l'erreur "Le type 'string' doit être un type de valeur non Nullable pour pouvoir l'utiliser comme paramètre 'T' dans le type ou la méthode générique 'System.Nullable'"?

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using Universe;

namespace Universe
{
    public class clsdictionary
    {
      private string? m_Word = "";
      private string? m_Meaning = "";

      string? Word { 
          get { return m_Word; }
          set { m_Word = value; }
      }

      string? Meaning { 
          get { return m_Meaning; }
          set { m_Meaning = value; }
      }
    }
}
DiversUtilisateur
la source
21
Stringest déjà nullable.
M.Babcock

Réponses:

204

Utilisez stringplutôt que string?partout dans votre code.

le Nullable<T> type nécessite que T soit un type valeur non nullable, par exemple intou DateTime. Les types de référence comme stringpeuvent déjà être nuls. Il ne servirait à rien d'autoriser des choses telles Nullable<string>que cela est interdit.

De plus, si vous utilisez C # 3.0 ou version ultérieure, vous pouvez simplifier votre code en utilisant des propriétés implémentées automatiquement :

public class WordAndMeaning
{
    public string Word { get; set; }
    public string Meaning { get; set; }
}
Mark Byers
la source
1
M.Babcock, quand je fais m_Word = null, des erreurs, des suggestions? Je veux pouvoir définir Word comme étant nul.
MiscellaneousUser
1
@MiscellaneousUser: Quel message d'erreur obtenez-vous? Pouvez-vous publier le fichier exact que vous avez essayé de compiler? Il est difficile de deviner quelle est votre erreur en ne voyant qu'une seule ligne de votre code. Je veux dire, il se peut qu'il vous manque un point-virgule ... mais peut-être que vous avez juste oublié de le copier + coller ... Ce n'est rien d'autre que des conjectures jusqu'à ce que vous publiez le code que vous avez essayé de compiler.
Mark Byers
Merci pour l'aide, j'ai vu cette publication stackoverflow.com/questions/187406/… et pouvez voir que le point d'interrogation ne concerne que les types valeur.
MiscellaneousUser
@MiscellaneousUser: Ce n'est pas seulement "pour les types valeur". Il doit s'agir spécifiquement d'un type valeur non nullable . Comme le dit le message d'erreur.
Mark Byers
1
Heh, après avoir programmé Swift pendant un moment, celui-ci a eu le meilleur de moi sur un projet C #.
Albert Bori
52

stringest un type de référence, une classe. Vous ne pouvez utiliser Nullable<T>ou le T?sucre syntaxique C # avec des types de valeur non nullables tels que intetGuid .

En particulier, tout comme stringun type référence, une expression de type stringpeut déjà être nulle:

string lookMaNoText = null;
Jon Skeet
la source
15

System.String (avec S majuscule) est déjà nullable, vous n'avez pas besoin de le déclarer comme tel.

(string? myStr) est faux.

Chagbert
la source
Petite modification de votre réponse, pour souligner l'importance de la majuscule. Je suis nouveau sur C # et il m'a fallu une éternité pour obtenir cette petite différence.
B - rian
4

Pour une raison très spécifique, Type Nullable<int>placez votre curseur sur Nullable et appuyez sur F12 - Les métadonnées fournissent la raison (notez la contrainte de structure):

public struct Nullable<T> where T : struct
{
...
}

http://msdn.microsoft.com/en-us/library/d5x73970.aspx

Joshua Enfield
la source
4
Notez que cela Nullable<Nullable<int>>n'est pas autorisé même s'il Nullable<int>s'agit d'une structure.
Mark Byers
C'est intéressant. Est-ce "codé en dur" dans le compilateur? Comment est-il contraint d'une structure spécifique (Nullable <Nullable <... >>)? - Modifier Je vois maintenant apparemment que c'est spécial - Erreur de compilation ... doit être un type de valeur non nullable ....
Joshua Enfield
4

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 l'attribution d'une valeur nulle à non nullable entraînerait un avertissement du compilateur.

Plus d'informations

ANewGuyInTown
la source