2010-09-20 3 views
1

Le C# 4.0 compilateur ne se plaint pas (pas même un avertissement):vraiment génial C# comportement du compilateur avec littéraux nullables

if(10.0 > null + 1) 
{  
} 

if (myDoubleValue > null) 
{ 
} 

Et il semble être toujours faux. Qu'est-ce qui se passe ici? Est-ce que null est automatiquement converti en Nullable<double> ou quelque chose?

Si oui, pourquoi ça ne marche pas alors:

double myDoubleValue = null + 1; 

Aussi, pourquoi voudrais-je jamais un tel comportement. Pourquoi est-ce une bonne chose qu'il est possible de jouer avec des littéraux comme celui-ci.

Répondre

8

La raison pour laquelle l'affectation ne fonctionne pas est que le résultat est de type double?, et non double. Le résultat sera toujours la valeur null pour le type double? (alias Nullable<double>).

Oh, et l'autre des deux premiers blocs devrait faire le compilateur se plaindre, avec des avertissements comme celui-ci:

Test.cs (7,19): CS0458 d'avertissement: Le résultat de l'expression est toujours 'null' de type 'int?'
Test.cs (12,13): avertissement CS0464: comparaison avec la valeur nulle de type 'double?' produit toujours « faux »

Gestion de compiler sans erreurs est pas le même que ne se plaint pas :)

+0

À droite J'ai accidentellement éteint les avertissements. Avec les avertissements activés, je n'aurais même pas à poser la question car le compilateur explique tout dans l'avertissement. – bitbonk

2
if(10.0 > null + 1) 
{ 

} 

est équivalent à:

int? i = null + 1; // i.HasValue = false in this case 
if(10.0 > i) 
{ 

} 

donc vous en train d'essayer pour comparer un type non nullable à un type nullable qui n'a pas de valeur.

double myDoubleValue = null + 1; 

ne compile pas parce que le type sur la main droite est int? et non double.

Est également cette question juste par curiosité dans la tentative de #% =^le compilateur ou vous écrivez réellement quelque chose comme ceci dans un vrai projet?

+0

Bien sûr que non. J'ai eu une faute de frappe dans mon code qui a donné un mauvais comportement. Pendant le débogage, j'ai découvert la faute de frappe et je me suis demandé pourquoi personne ne l'avait prévenu. Seulement pour remarquer plus tard que j'ai accidentellement désactivé l'onglet des avertissements dans Visual Studio. – bitbonk

Questions connexes