web-dev-qa-db-fra.com

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

Pourquoi ai-je le message d'erreur "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'"?

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; }
      }
    }
}
163
MiscellaneousUser

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

Le type Nullable<T> nécessite que T soit un type de valeur non nullable, par exemple int ou DateTime. Les types de référence tels que string peuvent déjà être null. Il serait inutile d'autoriser des choses comme Nullable<string> alors c'est interdit.

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

public class WordAndMeaning
{
    public string Word { get; set; }
    public string Meaning { get; set; }
}
199
Mark Byers

string est un type de référence, une classe. Vous pouvez uniquement utiliser le type Nullable<T> ou le sucre _T?_ C # avec des types de valeur non nullables 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 null:

_string lookMaNoText = null;
_
52
Jon Skeet

System.String est déjà nullable: vous n'avez pas besoin de le déclarer en tant que tel (chaîne? MyStr) est incorrect.

14
Chagbert

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

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

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

4
Joshua Enfield

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 effectuer les opérations suivantes:

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 autrement. attribuer une valeur null à non-nullable entraînerait un avertissement du compilateur.

Plus d'infos

0
ANewGuyInTown