Theo tài liệu của ==
nhà điều hành trong MSDN ,
Đối với các loại giá trị được xác định trước, toán tử đẳng thức (==) trả về true nếu các giá trị của toán hạng của nó bằng nhau, sai khác. Đối với các kiểu tham chiếu khác với chuỗi, == trả về true nếu hai toán hạng của nó tham chiếu đến cùng một đối tượng. Đối với loại chuỗi, == so sánh các giá trị của chuỗi. Các loại giá trị do người dùng xác định có thể quá tải toán tử == (xem toán tử). Vì vậy, các loại tham chiếu do người dùng định nghĩa, mặc dù theo mặc định == hoạt động như được mô tả ở trên cho cả các loại tham chiếu được xác định trước và do người dùng xác định.
Vậy tại sao đoạn mã này không biên dịch được?
bool Compare<T>(T x, T y) { return x == y; }
Tôi gặp lỗi Toán tử '==' không thể áp dụng cho toán hạng loại 'T' và 'T' . Tôi tự hỏi tại sao, theo như tôi hiểu ==
toán tử được xác định trước cho tất cả các loại?
Chỉnh sửa: Cảm ơn mọi người. Lúc đầu tôi không nhận thấy rằng tuyên bố chỉ nói về các loại tham chiếu. Tôi cũng nghĩ rằng so sánh từng bit được cung cấp cho tất cả các loại giá trị, mà bây giờ tôi biết là không chính xác.
Nhưng, trong trường hợp tôi đang sử dụng một loại tham chiếu, thì ==
toán tử sẽ sử dụng so sánh tham chiếu được xác định trước hay nó sẽ sử dụng phiên bản quá tải của toán tử nếu một kiểu được xác định?
Chỉnh sửa 2: Thông qua thử nghiệm và lỗi, chúng tôi đã biết rằng ==
toán tử sẽ sử dụng so sánh tham chiếu được xác định trước khi sử dụng loại chung không hạn chế. Trên thực tế, trình biên dịch sẽ sử dụng phương thức tốt nhất mà nó có thể tìm thấy cho đối số loại bị hạn chế, nhưng sẽ không tìm kiếm gì thêm. Ví dụ: mã bên dưới sẽ luôn in true
, ngay cả khi Test.test<B>(new B(), new B())
được gọi:
class A { public static bool operator==(A x, A y) { return true; } }
class B : A { public static bool operator==(B x, B y) { return false; } }
class Test { void test<T>(T a, T b) where T : A { Console.WriteLine(a == b); } }
==
không được phép giữa hai toán hạng cùng loại. Điều này đúng với struct
các loại (ngoại trừ các loại "được xác định trước") không quá tải operator ==
. Một ví dụ đơn giản, hãy thử điều này:var map = typeof(string).GetInterfaceMap(typeof(ICloneable)); Console.WriteLine(map == map); /* compile-time error */
var kvp1 = new KeyValuePair<int, int>(); var kvp2 = kvp1;
, sau đó bạn không thể kiểm tra kvp1 == kvp2
vì KeyValuePair<,>
là cấu trúc, nó không phải là loại được xác định trước C # và nó không quá tải operator ==
. Tuy nhiên, một ví dụ được đưa ra var li = new List<int>(); var e1 = li.GetEnumerator(); var e2 = e1;
mà bạn không thể làm được e1 == e2
(ở đây chúng ta có cấu trúc lồng nhau List<>.Enumerator
(được gọi "List`1+Enumerator[T]"
bởi bộ thực thi) không quá tải ==
).
bool
từ void
...