Đây có phải là một lỗi?
Đúng.
Xin chúc mừng, bạn đã tìm thấy một lỗi trong giải quyết quá tải. Lỗi tái tạo trong C # 4 và 5; nó không tái tạo trong phiên bản "Roslyn" của trình phân tích ngữ nghĩa. Tôi đã thông báo cho nhóm kiểm tra C # 5 và hy vọng chúng tôi có thể điều tra và giải quyết vấn đề này trước khi phát hành cuối cùng. (Như mọi khi, không có lời hứa.)
Một phân tích đúng sau đây. Các ứng cử viên là:
0: C(params string[]) in its normal form
1: C(params string[]) in its expanded form
2: C<string>(string)
3: C(string, object)
Ứng cử viên số 0 rõ ràng là không thể áp dụng được vì string
không thể chuyển đổi thành string[]
. Điều đó để lại ba.
Trong số ba, chúng tôi phải xác định một phương pháp tốt nhất duy nhất. Chúng tôi làm như vậy bằng cách so sánh từng cặp của ba ứng cử viên còn lại. Có ba cặp như vậy. Tất cả chúng đều có danh sách thông số giống hệt nhau khi chúng tôi loại bỏ các thông số tùy chọn bị bỏ qua, có nghĩa là chúng tôi phải đi đến vòng kết thúc nâng cao được mô tả trong phần 7.5.3.2 của đặc điểm kỹ thuật.
Cái nào tốt hơn, 1 hay 2? Điểm then chốt có liên quan là một phương pháp chung luôn kém hơn một phương pháp không chung chung. 2 kém hơn 1. Vì vậy 2 không thể là người chiến thắng.
Cái nào tốt hơn, 1 hay 3? Sự ràng buộc có liên quan là: một phương pháp chỉ áp dụng ở dạng mở rộng của nó luôn kém hơn một phương pháp áp dụng ở dạng bình thường. Do đó 1 kém hơn 3. Vì vậy 1 không thể là người chiến thắng.
Cái nào tốt hơn, 2 hay 3? Điểm then chốt có liên quan là một phương pháp chung luôn kém hơn một phương pháp không chung chung. 2 kém hơn 3. Vì vậy 2 không thể là người chiến thắng.
Để được chọn từ một tập hợp nhiều ứng viên thích hợp, ứng viên phải (1) bất bại, (2) đánh bại ít nhất một ứng viên khác và (3) là ứng cử viên duy nhất có hai thuộc tính đầu tiên. Ứng cử viên ba không bị đánh bại bởi ứng viên khác và đánh bại ít nhất một ứng cử viên khác; nó là ứng cử viên duy nhất có tài sản này. Do đó, ứng cử viên ba là ứng cử viên tốt nhất duy nhất . Nó sẽ thắng.
Không chỉ trình biên dịch C # 4 bị sai, như bạn lưu ý chính xác là nó đang báo cáo một thông báo lỗi kỳ lạ. Việc trình biên dịch nhận được sai phân tích độ phân giải quá tải là một điều hơi đáng ngạc nhiên. Việc nhận được thông báo lỗi sai là hoàn toàn không có gì đáng ngạc nhiên; heuristic lỗi "phương pháp mơ hồ" về cơ bản chọn bất kỳ hai phương pháp nào từ tập hợp ứng viên nếu không thể xác định được phương pháp tốt nhất. Nó không phải là rất tốt trong việc tìm ra sự mơ hồ "thực sự", nếu thực tế là có một.
Người ta có thể hỏi một cách hợp lý tại sao lại như vậy. Khá khó để tìm ra hai phương thức "không rõ ràng một cách rõ ràng" bởi vì quan hệ "tốt hơn" là không bên trong . Có thể xảy ra tình huống ứng viên 1 tốt hơn 2, 2 tốt hơn 3 và 3 tốt hơn 1. Trong những tình huống như vậy, chúng ta không thể làm tốt hơn là chọn hai trong số họ là "những người mơ hồ".
Tôi muốn cải thiện kinh nghiệm này cho Roslyn nhưng mức độ ưu tiên thấp.
(Bài tập dành cho độc giả: "Phát triển một thuật toán thời gian tuyến tính để xác định thành viên tốt nhất duy nhất của tập hợp n phần tử trong đó quan hệ tốt hơn là không trực tiếp" là một trong những câu hỏi tôi được hỏi vào ngày tôi phỏng vấn cho nhóm này. Nó không phải một thuật toán rất khó; hãy thử.)
Một trong những lý do tại sao chúng tôi đã lùi lại việc thêm các đối số tùy chọn vào C # trong thời gian dài là số lượng các tình huống phức tạp không rõ ràng mà nó đưa vào thuật toán giải quyết quá tải; rõ ràng là chúng tôi đã không hiểu đúng.
Nếu bạn muốn nhập vấn đề Kết nối để theo dõi, vui lòng. Nếu bạn chỉ muốn chúng tôi chú ý đến, hãy coi như đã xong. Tôi sẽ tiếp tục thử nghiệm vào năm tới.
Cảm ơn vì đã mang đến sự chú ý của tôi. Xin lỗi vì lỗi.
'Overloaded.ComplexOverloadResolution(string)'
đề cập đến<string>(string)
phương pháp; Tôi nghĩ rằng nó đề cập đến(string, object)
phương pháp không có đối tượng được cung cấp.