180 votes

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

Pourquoi ai-je obtenu l'erreur "The type 'string' must be a non-nullable value type in order to use it as parameter 'T' in the generic type or method '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; }
      }
    }
}

21 votes

String est déjà nullable.

0 votes

Je pense que cela pourrait répondre à votre question : Erreur de chaîne nullable en C# . Un utilisateur a posté des réponses identiques aux deux, et les deux copies ont été upvoted.

211voto

Mark Byers Points 318575

Utilisez string au lieu de string? à tous les endroits de votre code.

Le site Nullable<T> exige que T soit un type de valeur non nul, par exemple int ou DateTime . Les types de référence comme string peut déjà être nulle. Il n'y aurait aucun intérêt à autoriser des choses comme Nullable<string> il est donc refusé.

De même, si vous utilisez C# 3.0 ou une version ultérieure, vous pouvez simplifier votre code en utilisant propriétés auto-implémentées :

public class WordAndMeaning
{
    public string Word { get; set; }
    public string Meaning { get; set; }
}

2 votes

M.Babcock, quand je fais m_Word = null , il y a une erreur, des suggestions ? Je veux pouvoir définir Word comme étant nul.

1 votes

@MiscellaneousUser : Quel message d'erreur obtenez-vous ? Pouvez-vous poster 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 qu'il pourrait être que vous manquez un point-virgule ... mais peut-être que vous avez juste oublié de le copier + coller ... Ce n'est rien d'autre que des suppositions jusqu'à ce que vous postiez le code que vous avez essayé de compiler.

0 votes

Merci pour votre aide, j'ai vu ce message stackoverflow.com/questions/187406/ et on peut voir que le point d'interrogation ne concerne que les types de valeurs.

53voto

Jon Skeet Points 692016

string est un type de référence, une classe. Vous ne pouvez utiliser Nullable<T> ou le T? Sucre syntaxique C# avec non-nullable valeur tels que int et Guid .

En particulier, comme string est un type de référence, une expression de type string peut déjà être nulle :

string lookMaNoText = null;

15voto

Chagbert Points 46

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

(string? myStr) a tort.

0 votes

Petite modification de votre réponse, pour souligner l'importance de la majuscule. Je suis nouveau en C# et j'ai mis du temps à comprendre cette petite différence.

0 votes

Cette affirmation est fausse string est un alias pour System.String, ils sont les mêmes.

8voto

ANewGuyInTown Points 2165

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

All the reference types are non-nullable by default et vous pouvez effectivement 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, il faut l'indiquer, sinon l'affectation d'une valeur nulle à un type non nul entraînerait un avertissement du compilateur.

Plus d'informations

4voto

Joshua Enfield Points 4288

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 struct) :

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

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

4 votes

Notez cependant que Nullable<Nullable<int>> est rejetée même si Nullable<int> est une structure.

0 votes

C'est intéressant. Est-ce que c'est "codé en dur" dans le compilateur ? Comment est-il contraint à partir d'une structure spécifique (Nullable<Nullable<...>>) ? - Edit Je vois maintenant qu'apparemment c'est spécial - Compile Error...must be a non-nullable value type....

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X