2013-04-18 10 views
7

Perché il seguente frammento di codice restituisce 1:Confrontando Nan e restituisce un valore nullo valore illogicità

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

Dal mio punto di vista non ha senso. Un'eccezione sarebbe più appropriata.

Quale pensi fosse il ragionamento alla base della decisione.

+4

Durante l'ordinamento forza tutti i null e nans alla cima o alla fine di un elenco. Il "senso" nell'ordinamento di null e nans è esattamente come affermi: un punto di vista. Direi che è più sicuro gestirlo perché "IComparer/IComparable" spinge un sacco di cose in background, e la maggior parte delle volte può essere sovrascritto dall'utente se vuole comunque un comportamento diverso. –

+1

Qualcosa è meglio di niente. –

risposta

2

Dalla documentazione MSDN IComparable.CompareTo():

Per definizione, qualsiasi oggetto confronta superiore (o segue) nullo, e due riferimenti nulli confronta uguali tra loro.

Ciò risulta dalla documentazione Double.CompareTo(object):

restituisce un intero positivo se questo esempio è maggiore del valore. - oppure - Questa istanza è un numero e il valore non è un numero (NaN). -o-- valore è riferimento null (Nothing in Visual Basic).

Come Adamo Houldsworth sottolinea, se something.CompareTo(somethingElse) gettato un'eccezione quando somethingElse è nullo, allora l'ordinamento e cose del genere richiederebbe un sacco di gestione in più eccezioni.

4

Dalla documentazione sul CompareTo:

Il parametro valore deve essere nulla o un'istanza di doppia; altrimenti, viene generata un'eccezione. Qualsiasi istanza di Double, indipendentemente dal suo valore , è considerata superiore a null.

Il parametro di valore nell'esempio è null. NaN è quindi considerato maggiore di null ed è per questo che CompareTo restituisce correttamente 1.

2

Quando si decompilare CompareTo di double, si può vedere:

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

solo per mettere gli elementi nulli in fondo a qualsiasi sequenza ordinata.

Problemi correlati