2010-03-31 29 views
7

Tôi có một lớp chung chung có loại T. Trong lớp học này, tôi có một phương pháp đã được tôi cần phải so sánh một loại T đến một loại T như:Các toán tử so sánh nhị phân trên các loại chung

public class MyClass<T> 
{ 
    public T MaxValue 
    { 
     // Implimentation for MaxValue 
    } 

    public T MyMethod(T argument) 
    { 
     if(argument > this.MaxValue) 
     { 
      // Then do something 
     } 
    } 
} 

Các hoạt động so sánh bên trong MyMethod không thành công với trình biên dịch Lỗi CS0019. Có thể thêm ràng buộc vào T để thực hiện công việc này không? Tôi đã thử thêm where T: IComparable<T> vào định nghĩa lớp để không có kết quả.

+0

Không thể = (. Tuy nhiên, có một thư viện toán nguồn mở cố gắng xử lý nó, phải nhớ lại tên ... – vittore

Trả lời

9

Thêm ràng buộc để đảm bảo rằng loại thực hiện IComparable<T> là một cách để thực hiện. Tuy nhiên, bạn không thể sử dụng toán tử < - giao diện cung cấp một phương pháp CompareTo để làm điều tương tự:

public class MyClass<T> where T : IComparable<T> { 
    public T MaxValue { 
     // Implimentation for MaxValue 
    } 

    public T MyMethod(T argument) { 
     if(argument.CompareTo(this.MaxValue) > 0){ 
      // Then do something 
     } 
    } 
} 

Nếu bạn cần khai thác số khác hơn là chỉ so sánh, tình hình là khó khăn hơn, bởi vì bạn không thể thêm khó khăn để hỗ trợ ví dụ: + toán tử và không có giao diện tương ứng. Một số ý tưởng về điều này can be found here.

+0

Đánh tôi với nó. :) –

+0

Cuộc gọi tốt Tomas. Tôi đã tìm thấy bài đăng trên blog tại http://blogs.telerik.com/hristoborisov/posts/09-01-10/comparing_generic_types.aspx liên quan đến vấn đề chính xác này ngay sau khi tôi hỏi câu hỏi xác nhận những gì bạn đang nói. –

3

Không, không thể, các ràng buộc của toán tử không được phép trong C#. where T: IComparable<T> chỉ hoạt động tốt, nhưng bạn phải sử dụng ngữ nghĩa khác: phương pháp CompareTo thay vì các toán tử>, < và ==.

+0

Có và tôi không chắc chắn rằng OP đã kết hôn với việc sử dụng toán tử cho điều này –

+0

Hmm..Tôi không thực sự hiểu rõ ý kiến ​​của bạn – n535

+0

anh ấy có nghĩa là OP không có nghĩa vụ phải sử dụng những nhà khai thác đó.Bạn có thể sử dụng bất kỳ cách nào khác, als dài là nó hoạt động .. –

2

Bạn phải sử dụng phương thức 's CompareTo.

1

Thực ra, bạn không cần gì đặc biệt ở đây. Comparer<T>.Default cung cấp phương thức .Compare sẽ thực hiện mọi thứ bạn cần mà không yêu cầu bất kỳ ràng buộc chung bổ sung nào (có xu hướng lan truyền khủng khiếp). Nó hoạt động cho cả hai IComparable<T>IComparable và hỗ trợ các lớp, cấu trúc và Nullable<T>. Công việc hoàn thành.

Để biết thông tin, đây là cách triển khai LINQ Max/Min và tương tự như vậy List<T>.Sort. Vì vậy, một phần phổ biến và được hỗ trợ tốt của BCL.

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