2013-04-18 51 views
7

Tại sao đoạn mã sau trả 1:So sánh NaN và trả về rỗng illogic giá trị

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

Từ quan điểm của tôi nó làm cho không có ý nghĩa. Một ngoại lệ sẽ phù hợp hơn.

Bạn nghĩ lý do đằng sau quyết định là gì.

+4

Nó buộc tất cả các giá trị rỗng và nans vào đầu hoặc cuối danh sách khi sắp xếp. "Ý nghĩa" trong việc sắp xếp các giá trị rỗng và các nans là chính xác như bạn nói: một quan điểm. Tôi sẽ đoán rằng nó là an toàn hơn để xử lý này bởi vì 'IComparer/IComparable' ổ đĩa rất nhiều thứ trong nền, và có thể hầu hết thời gian được ghi đè bởi người sử dụng nếu họ muốn hành vi khác nhau anyway. –

+1

Có điều gì đó tốt hơn là không có gì. –

Trả lời

2

Từ các tài liệu MSDN trên IComparable.CompareTo():

Theo định nghĩa, bất kỳ đối tượng so sánh lớn hơn (hoặc sau) null, và hai tài liệu tham khảo vô so sánh tương đương với nhau.

Đây cũng là rõ ràng từ các tài liệu Double.CompareTo(object):

Trả về một số nguyên dương nếu dụ này lớn hơn giá trị. - hay - Ví dụ này là một số và giá trị không phải là số (NaN). -hoặc- giá trị là một tham chiếu null (Không có gì trong Visual Basic).

Như Adam Houldsworth chỉ ra, nếu something.CompareTo(somethingElse) ném một ngoại lệ khi somethingElse là null, sau đó phân loại và những thứ như vậy sẽ đòi hỏi rất nhiều xử lý ngoại lệ thêm.

4

Từ các tài liệu trên CompareTo:

Tham số Giá trị phải được null hoặc một thể hiện của hai; nếu không, một ngoại lệ sẽ được ném. Bất kỳ trường hợp nào của Double, bất kể giá trị của nó, được coi là lớn hơn null.

Thông số giá trị trong ví dụ của bạn là null. Do đó, NaN được coi là lớn hơn null, đó là lý do tại sao CompareTo trả về chính xác 1.

2

Khi bạn dịch ngược CompareTo của double, bạn có thể thấy:

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

chỉ để đưa các yếu tố null ở dưới cùng của bất kỳ chuỗi được sắp xếp.

Các vấn đề liên quan