5

Về cơ bản tôi đã điều sau đây:chế Generic - Tôi không chắc chắn làm thế nào để sửa chữa tình trạng này với một hoặc/hoặc trường hợp

public static bool IsBetween<T>(this T value, T a, T b) 
    where T : IComparable 
{ 
    ... 
} 

public static bool IsBetween<T>(this T value, T a, T b) 
    where T : IComparable<T> 
{ 
    ... 
} 

Vấn đề là tôi không thể làm điều này bởi vì bạn không thể có một thành viên có cùng chữ ký, ngay cả khi các ràng buộc khác nhau. Tuy nhiên, không có cách nào để nói rằng ràng buộc là IComparable HOẶC IComparable<T>. Vì vậy, tôi không chắc chắn phải làm gì ở đây ngoài việc chọn một và đi với nó. Và, cho dù tôi chọn cái nào, tôi sẽ mất đi cái kia vì chúng tách biệt và không thừa hưởng lẫn nhau (điều này có ý nghĩa).

Tôi có thiếu thứ gì đó ở đây trong đó có cách nào để thực hiện bằng cả hai hoặc tôi có phải chọn một (có lẽ là phiên bản chung) không?

Trả lời

8

Tôi không hiểu tại sao phương pháp đầu tiên hoàn toàn giống nhau. Tại sao không phải là nó chỉ:

public static bool IsBetween(this IComparable value, IComparable left, IComparable right) 

Giá trị nào làm cho phương pháp thêm chung? Rõ ràng là bạn sẽ không tránh hình phạt quyền anh vì các giá trị sẽ được đóng hộp khi bạn gọi CompareTo(object).

Trừ khi bạn có một số lý do thuyết phục để làm cho phương pháp chung chung, đừng làm cho nó chung chung. Sau đó nó có một chữ ký khác với phương pháp khác, và vấn đề của bạn được giải quyết.

+0

Tôi chưa từng nghĩ về nó như thế. Tôi đoán đó là vì tôi bắt đầu với phiên bản chung, sau đó sao chép/dán nó và cố gắng thực hiện một thay đổi nhanh chóng. –

+0

Ngoài ra, điều này có phải là mặc định để chọn tùy chọn 'IComparable ' trước tiên và tùy chọn 'IComparable' thứ hai? –

+1

@ m-y: Độ phân giải quá tải sẽ chọn phương thức * cụ thể hơn *. Nếu không có cách nào để xác định cái nào cụ thể hơn thì bạn sẽ gặp lỗi mơ hồ. –

3

Trong quá tải độ phân giải phương thức .NET không tính đến các loại trả về tài khoản và các ràng buộc chung. Vì vậy, ngay cả khi IComparableIComparable<T> có điểm chung mà vẫn không hoạt động. Chỉ cần chọn phiên bản IComparable<T>. Các kiểu .NET tiêu chuẩn như Int32, Decimal, DateTime, ... thực hiện cả hai giao diện.

+0

Đó là những gì tôi đã tìm, nhưng tôi muốn đảm bảo rằng tôi không bỏ sót điều gì ở đây. Tôi sẽ kết thúc với phiên bản chung. Tôi đã chỉ hy vọng có phương pháp của tôi có sẵn cho mã khác mà chỉ thực hiện 'IComparable' và không phải cả hai (hoặc chỉ' IComparable '). –

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