2013-04-18 24 views
7

Dlaczego następujący fragment kodu zwraca 1:Porównując NaN i zwraca wartość NULL nielogiczności

double i = double.NaN; 
double? i2 = null; 
i.CompareTo(i2); 

Z mojego punktu widzenia to nie ma sensu. Wyjątek byłby bardziej odpowiedni.

Co według ciebie było uzasadnieniem decyzji.

+4

Wymusza wszystkie wartości null i nans na górze lub na dole listy podczas sortowania. "Zmysł" w sortowaniu wartości null i nans jest dokładnie taki, jaki określasz: punkt widzenia. Sądzę, że bezpieczniej było z tym poradzić, ponieważ 'IComparer/IComparable' napędza wiele rzeczy w tle i przez większość czasu może być przesłonięty przez użytkownika, jeśli i tak chce on innego zachowania. –

+1

Coś jest lepsze niż nic. –

Odpowiedz

2

Z dokumentacji MSDN na IComparable.CompareTo():

Z definicji, każdy obiekt porównuje większy niż (lub poniżej) null, oraz dwie referencje zerowe porównać sobie równe.

Wynika to również z dokumentów Double.CompareTo(object):

Zwraca dodatnia, jeśli tym przypadku jest większy niż wartość. -lub- Ta instancja jest liczbą, a wartość nie jest liczbą (NaN). -lub- wartość jest zerową referencją (Nic w Visual Basic).

Adam Houldsworth zwraca uwagę, jeśli something.CompareTo(somethingElse) zwrócił wyjątek podczas somethingelse jest zerowy, a następnie sortowania i takie rzeczy wymagałaby dużo dodatkowej obsługi wyjątków.

4

Z dokumentacji na CompareTo:

Parametr Wartość musi być zerowy lub instancją dwukrotnie; w przeciwnym razie zostanie zgłoszony wyjątek. Każde wystąpienie Double, niezależnie od jego wartości , jest uważane za większe niż zero.

Parametr wartości w twoim przykładzie to null. NaN jest zatem uważane za większe niż zero, dlatego CompareTo poprawnie zwraca 1.

2

Kiedy dekompilować CompareTo o double, można zobaczyć:

public int CompareTo(object value) 
{ 
    if (value == null) 
    return 1; 

prostu umieścić elementy null na dole każdej posortowanej sekwencji.

Powiązane problemy