thể trùng lặp:
Generic methods and method overloadingTại sao sự mơ hồ với generics không phù hợp, thay vì tăng lỗi?
Nói rằng tôi có một lớp học như
class SortedList<K>
{
public string this[int i] { get { return "a"; /* dummy sample code */ } }
public string this[K key] { get { return "b"; /* dummy sample code */ } }
}
Bây giờ chúng ta hãy nói một số anh chàng quyết định sử dụng nó:
static string Test1<K>(K key) { return new SortedList<K>()[key]; }
Trình biên dịch giải quyết cuộc gọi này đến quá tải K key
.
Bây giờ, độ tương phản này với nói
static string Test2(int key) { return new SortedList<int>()[key]; } // whoops
nơi trình biên dịch này để giải quyết các int i
quá tải.
Bây giờ nếu một số linh hồn tội nghiệp nói Test1(0)
, anh ta sẽ nhận được kết quả khác sau đó nếu anh ta nói Test2(0)
, mặc dù cơ thể trông khá giống hệt nhau ở cái nhìn đầu tiên.
Điều thú vị hơn là, trong mọi trường hợp, trình biên dịch hoặc thời gian chạy không phát hiện được sự mơ hồ và đưa ra lỗi.
Thay vào đó, thời gian chạy chỉ thay đổi hành vi của nó liên quan đến việc liệu giá trị có phải là chung hay không, điều này có thể rõ ràng bất ngờ cho người gọi.
Tại sao là hành vi không phù hợp?
Hoặc, tốt hơn, tại sao không có lỗi trình biên dịch (hoặc thời gian chạy) vì sự mơ hồ?
@SergRogovtsev: Wow, đẹp quá! Không thấy cái đó; dường như trả lời điều này một cách hoàn hảo.Chúng ta nên bỏ phiếu để đóng câu hỏi của tôi sau đó. – Mehrdad