A l'origine, j'avais l'impression que NULL était un type de référence parce qu'il était assigné à des références, puis j'ai rencontré ce concept de type de valeur nullable, ce qui a mis ma théorie dans une situation délicate, alors le type de valeur NULL est-il un type de référence sur terre ?
Réponses
Trop de publicités?La spécification de C# est claire sur ce point : la fonction null
représentent un expression qui n'a pas de type . Il n'est ni de type référence, ni de type valeur, ni de type pointeur. Cependant cette expression est convertible à tous ces types. Il n'est pas nécessaire que le compilateur classe toutes les expressions comme ayant un type, et en fait il ne le fait pas.
Vous pourriez alors demander au moment de l'exécution quel est le type d'une référence nulle, quel est le type d'une valeur nulle de type nullable, et quel est le type d'un pointeur nul. Les réponses sont les suivantes :
-
une référence nulle n'a pas de type. Si vous avez une boîte qui peut contenir des chocolats, il est inutile de demander "quelle marque de chocolats se trouve dans cette boîte vide". Un chocolat manquant n'a pas de marque ; une référence nulle n'a pas de type.
-
De même, le type d'un pointeur nul n'est, là encore, rien ; les valeurs des pointeurs nuls ne pointent vers rien. Si vous avez une feuille de papier sur laquelle figure l'adresse 1600 Pennsylvania Avenue, vous pouvez demander "quelle est la couleur de la maison à cette adresse" et obtenir la réponse : blanc. Si vous avez une feuille de papier vierge, demander quelle est la couleur de la maison à cette adresse ne vous donne aucune réponse utile.
-
une valeur nulle d'un type de valeur annulable est une valeur du type de valeur annulable.
null
n'est pas un type.
De msdn :
Le mot-clé null est un littéral qui représente une référence nulle, c'est-à-dire une référence qui ne renvoie à aucun objet.
Types nuls sont des instances de la Nullable<T>
struct qui " Représente un type de valeur qui peut être affecté à null. "
Ni l'un ni l'autre. null
est le default
pour les types de référence, mais il n'a pas de type lui-même.
Les types de valeurs nuls sont en fait implémentés comme des types de valeurs eux-mêmes - il y a juste des astuces de compilation et de bibliothèque pour qu'ils se comportent comme prévu lorsqu'ils sont comparés aux types de valeurs suivants null
.
null
n'a pas de type en soi en C#, comme cela a déjà été dit ici. Je pense que des exemples précis montrant les implications de cette définition manquent dans les autres réponses.
var quelque chose = null ;
n'est pas valide
string a = null; // valid. Null is implicitely casted to string.
int? b = null; // valid. Null is implicitely casted to Nullable<int>.
var c = "hello" // valid, type of c is infered by the compiler by looking at the right side of the expression.
var d = null; // not valid, compiler can't infer any type from null !
La ligne invalide dans l'exemple ci-dessus provoquera l'erreur de compilation suivante :
Erreur - CS0815 - Impossible d'assigner à une variable implicitement typée
et aussi :
Passer null à des méthodes surchargées peut nécessiter un cast explicite.
void myMethod(int? myParam) { }
void myMethod(string myParam) { }
void test
{
string a = null;
myMethod(a); // no problem here, a is of type string so 2nd overload will be used.
myMethod(null); // not valid ! Compiler can't guess which one you want.
myMethod((string) null); // valid, null is casted to string so 2nd overload is to be used.
}
La ligne invalide dans l'exemple ci-dessus provoquera l'erreur de compilation suivante :
Erreur - CS0121 - L'appel est ambigu entre les méthodes suivantes ou propriétés suivantes : 'myMethod(string)' et 'myMethod(int ?)'.
- Réponses précédentes
- Plus de réponses