2011-07-31 49 views
9

Tôi có một lớp chung MyClass<T> trong đó T nên chỉ là những loại có thể so sánh được.Giới hạn các loại chung trong C#

Điều này chỉ có nghĩa là các loại và lớp số, trong đó các phương thức cho toán tử quan hệ đã được xác định. Làm thế nào để tôi làm điều này ?

Trả lời

10

Bạn không thể hạn chế điều hành, nhưng bạn có thể hạn chế giao diện. Do đó, dự định sử dụng >=, <=, == đã hết, nhưng bạn có thể sử dụng CompareTo, Equals.

where T : IComparable<T> 

Interface documentation

Giao diện này mang đến cho bạn phương pháp CompareTo đó là hữu ích cho trật tự quan hệ (lớn hơn, nhỏ hơn, vv). Các nguyên tố và chuỗi đã triển khai thực hiện điều này, nhưng bạn sẽ cần phải thực hiện điều này cho các kiểu tùy chỉnh của riêng bạn. Bạn sẽ sử dụng nó như thế này

void SomeMethod<T>(T alpha, T beta) where T : IComparable<T> 
{ 
    if (alpha.CompareTo(beta) > 0) 
    { 
     // alpha is greater than beta, replaces alpha > beta 
    } 
    else if (alpha.CompareTo(beta) < 0) 
    { 
     // alpha is less than beta, replaces alpha < beta 
    } 
    else 
    { 
     // CompareTo returns 0, alpha equals beta 
    } 
} 

Equals bạn nhận được theo mặc định như một phương pháp ảo trên object. Bạn muốn ghi đè phương thức này trên các kiểu tùy chỉnh của riêng bạn nếu bạn muốn một cái gì đó khác với bình đẳng tham chiếu được sử dụng. (Người ta cũng khuyên để ghi đè GetHashCode cùng một lúc.)

+0

IComparable không có phương pháp Equals, thats IEquatable –

+0

@ Nathan, bạn là chính xác, nhưng 'Equals' là một phương pháp ảo trên các đối tượng theo mặc định, vì vậy tôi đã không đề cập đến giao diện trong câu trả lời. Sẽ cập nhật cho rõ ràng. –

+0

Tôi đã làm như vậy nhưng bây giờ tôi nhận được lỗi 'nhà điều hành rohit89

3

Bạn có thể giới hạn loại chung cho chỉ các lớp thực hiện giao diện IComparable bằng cách sử dụng công cụ sửa đổi vị trí.

public class MyClass<K> where K : IComparable 
{ 
    .... 
} 
3

Nếu bạn muốn giới hạn nó vào những thứ có thể được so sánh, bạn có thể làm những việc như:

public class MyClass<T> where T:IComparable 
-1

Nếu tốc độ là liên quan bằng cách sử dụng các phương pháp được đề xuất sẽ cung cấp cho bạn một sự mất mát to lớn về hiệu suất. Nếu không, tất cả mọi thứ được đề xuất đều hoạt động tốt.

Đây là vấn đề tôi phải giải quyết rất thường xuyên vì các kiểu dữ liệu nguyên thủy trong C# không có kiểu dữ liệu "Số" thường được đề xuất và yêu cầu bởi những người khác ở đây.

Có lẽ phiên bản tiếp theo của C# sẽ có nó, nhưng tôi nghi ngờ ...

+0

Tại sao bạn nghĩ hiệu suất giảm? Tôi không chắc chắn lý do tại sao bạn đề cập đến kiểu dữ liệu số ở đây. Bạn muốn có loại số nào? – oleksii

+0

Tôi đã làm rất nhiều thử nghiệm gần đây, bởi vì trong khuôn khổ của chúng tôi, chúng tôi cần một hệ thống kiểu rất linh hoạt. Giả sử bạn có một mảng chung của các kiểu dữ liệu nguyên thủy khác nhau. Làm thế nào bạn sẽ chạy qua một mảng? Làm thế nào bạn sẽ thực hiện một so sánh của một mảng chung. Làm thế nào bạn sẽ làm các phép toán trên mảng này vì có các phép toán được định nghĩa trên một kiểu dữ liệu chung chung. Đây là một lý do để có hạn chế số liệu kiểu số. Có lẽ đây là một chút ít văn bản để giải thích tình hình của tôi, nhưng có rất nhiều chủ đề xung quanh ở đây cho thấy vấn đề. – msedi

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