tôi nghĩ phương pháp này là hợp lệ nhưng tôi đã sai:Toán tử '==' cho loại T?
static void Equals<T>(T x, T y)
{
return x == y; //operator == can't be applied to type T
}
Sau khi đọc specifiation (§7.2.4 trong v3.0 và §7.3.4 trong v4.0):
7.2.4 hành binary độ phân giải quá tải
một hoạt động của y hình thức x op, nơi op là một overloadable điều hành nhị phân, x là một biểu hiện của loại x, và y là một biểu hiện của loại Y, được xử lý như sau:
Tập hợp các ứng cử viên vận hành do người dùng định nghĩa cung cấp bởi X và Y đối với các nhà điều hành hoạt động op (x, y) được xác định. Bộ bao gồm sự kết hợp của các toán tử ứng viên được cung cấp bởi X và toán tử ứng cử viên do Y, xác định sử dụng các quy tắc §7.2.5. Nếu X và Y cùng loại, hoặc nếu X và Y bắt nguồn từ một loại cơ sở chung , thì chia sẻ toán tử ứng cử viên chỉ xuất hiện trong tập hợp kết hợp một lần.
Nếu bộ ứng cử viên khai thác người dùng định nghĩa là không trống rỗng, sau đó điều này trở thành tập các nhà khai thác ứng cử viên cho các hoạt động . Nếu không, các triển khai op nhị phân được xác định trước nhị phân, bao gồm các biểu mẫu đã được dỡ bỏ của chúng, trở thành tập hợp các toán tử ứng cử viên cho hoạt động . Việc triển khai được xác định trước của nhà điều hành đã cho được chỉ định trong mô tả của toán tử (từ 7,7 đến §7,11).
Quy tắc giải quyết quá tải của §7.4.3 được áp dụng cho bộ toán tử ứng cử viên để chọn toán tử tốt nhất đối với danh sách đối số (x, y) và toán tử này trở thành kết quả của quá trình giải quyết quá tải . Nếu độ phân giải quá tải không chọn được một toán tử tốt nhất, một lỗi biên dịch sẽ xảy ra.
Trong bước 2 Tôi nghĩ rằng thực hiện được xác định trước điều này nên được áp dụng:
bool operator ==(object x, object y);
bool operator !=(object x, object y);
kể từ khi tất cả mọi thứ trong C# bắt nguồn từ Object. Làm thế nào một lỗi biên dịch có thể xảy ra ở bước 3? Tôi không nghĩ rằng có thể "độ phân giải quá tải không thể chọn" trong trường hợp này.
EDIT Câu hỏi đặt ra hiện lên trong đầu tôi khi tôi đã thực hiện một cái gì đó như thế này:
class EnumComparer<TEnum> : IEqualityComparer<TEnum>
{
public bool Equals(TEnum x, TEnum y)
{
return x == y;
}
public int GetHashCode(TEnum obj)
{
return (int)obj;
}
}
Tôi sợ rằng tôi cần phải xây dựng một biểu hiện và gọi nó dynamicly trong Equals
phương pháp.
thể trùng lặp của [C# so sánh hai giá trị chung] (http://stackoverflow.com/questions/488250/c-compare-two-generic-values) –
FWIW, '(object) x == (đối tượng) y' là hợp lệ - nhưng hãy xem xét '(đối tượng) 1 == (đối tượng) 1' làm lý do không mong muốn điều này. Chỉ cần giúp 'T' cùng với một không chung chung. –
Thảo luận là một chút trừu tượng, nhưng Eric Lippert đã chỉ ra rằng đó là một quan niệm sai lầm chung rằng mọi thứ * xuất phát từ 'Object'. http://blogs.msdn.com/b/ericlippert/archive/2009/08/06/not-everything-derives-from-object.aspx Điểm liên quan mà anh đề cập là các tham số kiểu không lấy được từ bất kỳ thứ gì. –