79 votes

Pourquoi fait > = retour lorsque false == retourne la valeur true pour les valeurs null ?

J’ai deux variables de type int ? (ou Nullable Si vous voulez). J’ai voulu faire un supérieur-inférieur ou égal (> =) comparaison sur deux variables, mais comme il s’avère, cela retourne false si les deux variables sont null, tandis qu’évidemment le == opérateur retourne la valeur true.

Quelqu'un peut-il expliquer à moi pourquoi c’est logique parce que la définition sémantiques de la > = opérateur contient le mot « ou » ?

98voto

Eric Lippert Points 300275

Il y a un énorme débat sur cette bizarrerie lorsque la fonction a été conçu à l'origine du dos en C# 2.0. Le problème est que C# les utilisateurs sont entièrement utilisés à ce que cela soit significatif:

if(someReference == null)

Lors de l'extension de l'égalité de nullable types de valeur, vous avez les choix suivants.

1) Nullable l'égalité est vraiment levé. Si l'un ou les deux opérandes est null, le résultat n'est ni vrai, ni faux, mais la valeur null. Dans ce cas, vous pouvez soit:

1a) Rendent illégal le fait d'avoir un nullable type de la valeur de l'égalité dans une instruction "if", parce que l'instruction "if" a besoin d'un bool, non nullable bool. Au lieu de cela, tout le monde à utiliser "HasValue" s'ils veulent comparer à la valeur null. C'est verbeux et irritant.

1b) de convertir Automatiquement null false. L'inconvénient de cette est que "x==null" renvoie la valeur faux si x est nulle, ce qui est source de confusion et fonctionne à l'encontre de la compréhension des gens de nulle comparaisons avec les types de référence.

2) Nullable l'égalité n'est pas levé. Nullable l'égalité est vraie ou fausse, et la comparaison à la valeur null est une valeur null vérifier. Cela rend nullable l'égalité incompatible avec les valeurs null de l'inégalité.

Aucun de ces choix n'est évidemment correct; ils ont tous des avantages et des inconvénients. VBScript choisit 1b, par exemple. Après beaucoup de débats en C# à l'équipe de conception a choisi #2.

60voto

Henk Holterman Points 153608

Parce que l’égalité est définie séparément de comparabilité.
Vous pouvez tester , mais n’a aucun sens. En c#, il sera toujours false.

11voto

NealB Points 11102

Une autre façon de décrire '>=' est: Pas Moins De. Aucune mention d'égal à égal. Dès que l'un des opérandes dans un non-test d'égalité est Null, le résultat est inconnu (null). Toutefois, si vous voulez savoir si les deux opérandes sont de type Null, Null == Null est raisonnable de test (devrait se traduire dans le vrai). Se débarrasser de l'inégalité, la part de l'opérateur qui fait toute la différence.

L'exemple de code suivant à partir de http://msdn.microsoft.com/en-us/library/2cf62fcy.aspx#sectionToggle4 résumé de la façon dont C# traite Null:

int? num1 = 10;   
int? num2 = null;   
if (num1 >= num2)   
{   
    Console.WriteLine("num1 is greater than or equal to num2");   
}   
else   
{   
    // This clause is selected, but num1 is not less than num2.   
    Console.WriteLine("num1 >= num2 returned false (but num1 < num2 also is false)");   
}   

if (num1 < num2)   
{   
    Console.WriteLine("num1 is less than num2");   
}   
else   
{   
    // The else clause is selected again, but num1 is not greater than   
    // or equal to num2.   
    Console.WriteLine("num1 < num2 returned false (but num1 >= num2 also is false)");   
}   

if (num1 != num2)   
{   
    // This comparison is true, num1 and num2 are not equal.   
    Console.WriteLine("Finally, num1 != num2 returns true!");   
}   

// Change the value of num1, so that both num1 and num2 are null.   
num1 = null;   
if (num1 == num2)   
{   
    // The equality comparison returns true when both operands are null.   
    Console.WriteLine("num1 == num2 returns true when the value of each is null");   
}   

/* Output:   
 * num1 >= num2 returned false (but num1 < num2 also is false)   
 * num1 < num2 returned false (but num1 >= num2 also is false)   
 * Finally, num1 != num2 returns true!   
 * num1 == num2 returns true when the value of each is null   
 */   

2voto

Aaron McIver Points 16766

``fonctionne sur une valeur numérique ; Quel null n’est pas.

Vous pouvez surcharger le `` opérateur de fournir ce que vous désirez sur un type spécifique.

0voto

Sam Points 65

NULL n’est pas nulle (valeur numérique ou binaire), une chaîne de longueur nulle ou vide (valeur de caractère). Si un opérateur de comparaison retournera toujours false sur elle. Lire la suite ici

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X