Maison >développement back-end >C++ >Pourquoi C# autorise-t-il les comparaisons de types de valeurs à zéro, même si elles sont toujours évaluées à False ?
Comportement inattendu de la comparaison nulle de type valeur C#
En C#, les types de valeur tels que les entiers et DateTime ne sont généralement pas nullables, ce qui signifie qu'ils ne peuvent pas être attribués à null. Cependant, dans certains cas, C# permet de comparer un type valeur à null sans générer d’erreur.
Résolution de surcharge des opérateurs et types nullables
L'une des raisons est liée à la résolution de la surcharge de l'opérateur. C# prend en charge la surcharge d'opérateurs, permettant aux développeurs de définir des opérateurs personnalisés pour leurs classes. Pour l'opérateur d'égalité (==), il existe des opérateurs définis pour les types valeur nullables.
Considérez l'extrait de code suivant :
<code class="language-csharp">Int32 x = 1; if (x == null) { ... }</code>
Ce code est compilé car le compilateur C# a trouvé la surcharge appropriée de l'opérateur d'égalité. Les variables locales int sont implicitement convertibles en entiers nullables (int ?), et les littéraux nuls sont également des entiers nullables. Par conséquent, l'opérateur == peut être appliqué aux deux entiers nullables.
Même si l'expression (x == null) est toujours évaluée comme fausse, elle est considérée comme une comparaison valide.
Convertir en type nullable
Une autre situation est celle où vous essayez de comparer un type valeur avec une référence d'objet nulle. Par exemple :
<code class="language-csharp">object o = null; if (x == o) { ... }</code>
Dans ce cas, la variable int x sera convertie en objet de type, permettant la comparaison avec null. Cependant, le résultat de cette comparaison est toujours faux.
Structures nullables et expressions conditionnelles
Les membres statiques d'une structure, tels que DateTime.Now, peuvent être vides par défaut. Cela signifie que vous pouvez les comparer à null mais le contexte doit être pris en compte. Dans votre exemple :
<code class="language-csharp">if (test.ADate == null) { ... }</code>
L'expression test.ADate est nullable car elle est membre d'une structure, même si elle n'est pas explicitement déclarée nullable. Cependant, une comparaison avec null est toujours considérée comme une expression constante, elle est donc toujours évaluée comme fausse.
En résumé, C# permet de comparer les types valeur à null grâce à la résolution de surcharge d'opérateur et aux conversions automatiques. Cependant, il est important de comprendre que le résultat de ces comparaisons est toujours faux car les types valeur ne peuvent pas être attribués à null.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!