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; }
}
}
}
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; }
}
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;
_
System.String est déjà nullable: vous n'avez pas besoin de le déclarer en tant que tel (chaîne? MyStr) est incorrect.
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
{
...
}
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.