2009-07-24 28 views
6

Nếu một gọi phương thức .Max() mở rộng trên một IEnumerable<T>, và các đối tượng trong phạm vi không thực hiện IComparable, ai được System.ArgumentException: At least one object must implement IComparable.Tại sao IEnumerable <T> .Max buộc T là IComparable?

Tại sao không Max và phương pháp tương tự như chế T để thực hiện IComparable, vì vậy mà vấn đề này có thể được bắt gặp tại thời gian biên dịch thay vì tại thời gian chạy?

+0

Trong khi viết câu hỏi tôi nghĩ về câu trả lời, nhưng vẫn nghĩ rằng nó đáng để hỏi. –

Trả lời

6

Tôi đoán vì nó linh hoạt hơn. Ví dụ: bạn có thể có một số IEnumerable<object> có chứa chuỗi, trong trường hợp này, Max() có thể được gọi khá an toàn trên đó, mặc dù thực tế là loại Object không thực hiện IComparable.

+6

Một khía cạnh khó khăn của nhiều vấn đề thiết kế là quyết định làm thế nào để cân bằng nỗi đau của một hệ thống mạnh mẽ với một yêu cầu nặng nề chống lại nỗi đau của một hệ thống linh hoạt có thể thất bại trong thời gian chạy. Trong trường hợp cụ thể này, các nhà thiết kế đã lựa chọn tính linh hoạt trên độ mạnh mẽ; cho dù đó là sự lựa chọn _right_ chắc chắn là gây tranh cãi, nhưng một số lựa chọn phải được thực hiện và không có lựa chọn nào là hoàn hảo. –

+1

@Eric: +1, nhưng tôi ước bạn đã đăng câu trả lời để tôi có thể chấp nhận câu trả lời đó. –

8

So sánh là ... vui nhộn. Thứ nhất, bạn có lựa chọn IComparable<T> hoặc IComparable - bạn sẽ chọn loại nào? Hiện tại (thông qua Comparer<T>.Default) nó hỗ trợ cả hai, nhưng không có "hoặc" hạn chế chung này.

Sau đó, bạn gặp sự cố Nullable<T>; điều này có các so sánh "được dỡ bỏ", vì vậy liệu nó có thể so sánh được hay không phụ thuộc vào số T; nhưng một lần nữa, Comparer<T>.Default giải quyết vấn đề này cho chúng tôi (Nullable<T> thực hiện không IComparable cũng không IComparable<T>).

Plus; nó tiết kiệm trên tuyên truyền chung ràng buộc; ngay sau khi bạn có một ràng buộc như thế này trong mã thư viện, nó nhanh chóng lây nhiễm tất cả các mã gọi ngược dòng, làm cho nó trở thành một slog cứng.

+0

Câu trả lời sâu sắc. Được +1 của tôi bây giờ, sẽ không chấp nhận được vì tôi không muốn khuyến khích các câu trả lời khác. –

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