2012-08-07 18 views
20

Trong Đặc tả Ngôn ngữ C# Phiên bản 4, Nhà khai thác 1.6.7.5 là thông tin về các toán tử List<T>: ==!=. Nhưng tôi không thể tìm thấy các toán tử như vậy được định nghĩa trong List<T>? Tui bỏ lỡ điều gì vậy?Danh sách <T> nhà điều hành == Trong Đặc tả Ngôn ngữ C# Phiên bản 4

Mẫu mã từ 1.6.7.5 Các nhà khai thác:

List<int> a = new List<int>(); 
a.Add(1); 
a.Add(2); 
List<int> b = new List<int>(); 
b.Add(1); 
b.Add(2); 
Console.WriteLine(a == b); // Outputs "True" => here I get False as well 
b.Add(3); 
Console.WriteLine(a == b); // Outputs "False" 
+0

Xin giải thích câu hỏi của bạn rõ ràng hơn – darnir

+5

Xin đừng nói "Đầu ra" cho "Tôi muốn nó .." :) –

+8

@pst Mã này được sao chép và dán đúng nguyên văn từ spec ngôn ngữ, cùng với lời bình luận. – dasblinkenlight

Trả lời

17

Thông số này thực sự chính xác, mặc dù khó hiểu. Spec xác định một lớp được gọi là List (lựa chọn đặt tên nghèo).

Bảng sau đây hiển thị danh sách chung được gọi là Danh sách, danh sách này triển khai danh sách các đối tượng có thể phát triển. Lớp này chứa một số ví dụ về các loại thành viên hàm phổ biến nhất.

Lớp này có thể được xem trong thông số kỹ thuật tại mục 1.6.7. Toán tử Equals bị quá tải và khớp với đầu ra được giải thích ở trên. Có lẽ một cái tên tốt hơn nên được chọn cho lớp đó.

static bool Equals(List<T> a, List<T> b) { 
    if (a == null) return b == null; 
    if (b == null || a.count != b.count) return false; 
    for (int i = 0; i < a.count; i++) { 
     if (!object.Equals(a.items[i], b.items[i])) { 
      return false; 
     } 
    } 
    return true; 
} 
21

List<T> là một loại tài liệu tham khảo mà không quá tải operator==. Do đó, nó sử dụng ngữ nghĩa tham chiếu bình đẳng mặc định. Bạn có vẻ là theo ấn tượng rằng nó ghi đè operator== để cung cấp ngữ nghĩa giá trị, nhưng nó không. a sẽ bằng b khi ab cả hai đều tham chiếu cùng một phiên bản List<T>.

EDIT: Vì vậy, tôi đã xem xét thông số kỹ thuật của mình. Nó nói:

Lớp danh sách tuyên bố hai toán tử, toán tử == và toán tử! =, Và do đó mang lại ý nghĩa mới cho các biểu thức. Cụ thể, các toán tử xác định sự bình đẳng của hai cá thể List (Danh sách) khi so sánh từng đối tượng chứa bằng các phương thức Equals của chúng. Ví dụ sau sử dụng toán tử == để so sánh hai thể hiện của Liệt kê.

Thực lòng ... Tôi không biết họ đang nói gì, nhưng điều này có vẻ không chính xác. Theo như tôi có thể nói sau khi chạy một vài bài kiểm tra, lớp List<T> sử dụng bình đẳng tham chiếu. Câu hỏi hay.

EDIT2: Đã biên dịch List<T>, không operator== và/hoặc operator!= quá tải. Thông số này có vẻ hoàn toàn không chính xác trong trường hợp này.

+1

Thông số ngôn ngữ nói khác: "Danh sách lớp khai báo hai toán tử, toán tử == và toán tử! =, Và do đó mang lại ý nghĩa mới cho các biểu thức áp dụng các toán tử đó cho các cá thể Liệt kê. Cụ thể, các toán tử xác định sự bình đẳng của hai trường hợp Danh sách khi so sánh từng đối tượng chứa bằng phương thức Equals của chúng. " – dasblinkenlight

+0

@dasblinkenlight: Bạn nói đúng, tôi đang đọc nó ngay bây giờ. Đang cố gắng hiểu nó ... –

+0

@DanielDusek: Vâng, tôi vừa thêm nó vào bài đăng của tôi. Có vẻ như không chính xác. Thực tế không phù hợp với thông số kỹ thuật. –

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