Vì vậy, tôi đọc Eric Lippert's 'Constraints are not part of the signature' và bây giờ tôi hiểu rằng thông số kỹ thuật chỉ định rằng các ràng buộc loại được kiểm tra Sau khi giải quyết quá tải, nhưng tôi vẫn chưa rõ lý do tại sao điều này phải đúng. Dưới đây là Eric dụ:Tại sao không phải là loại ràng buộc một phần của chữ ký phương pháp?
này không biên dịch vì có độ phân giải quá tải cho: Foo(new Giraffe())
suy luận rằng Foo<Giraffe>
là trận đấu quá tải tốt nhất nhưng sau đó những hạn chế loại thất bại và một lỗi thời gian biên dịch được ném. Trong các từ của Eric:
Nguyên tắc ở đây là độ phân giải quá tải (và phương pháp kiểu suy luận) tìm thấy kết hợp tốt nhất có thể giữa danh sách đối số và danh sách các thông số chính thức của từng ứng cử viên. Đó là, họ nhìn vào chữ ký của phương pháp ứng cử viên.
Ràng buộc loại KHÔNG phải là một phần của chữ ký, nhưng tại sao chúng không thể? Một số kịch bản ở đâu là một ý tưởng tồi để xem xét các ràng buộc kiểu chữ một phần của chữ ký? Có khó khăn hay không thể thực hiện? Tôi không ủng hộ rằng nếu sự lựa chọn quá tải tốt nhất là vì bất kỳ lý do gì không thể gọi thì âm thầm dự phòng đến mức tốt nhất thứ hai; Tôi ghét điều đó. Tôi chỉ đang cố gắng hiểu tại sao các ràng buộc loại không thể được sử dụng để tác động đến việc lựa chọn tình trạng quá tải tốt nhất.
Tôi tưởng tượng rằng trong nội bộ biên dịch C#, chỉ cho mục đích giải quyết tình trạng quá tải (nó không vĩnh viễn viết lại phương pháp này), như sau:
static void Foo<T>(T t) where T : Reptile { }
được chuyển thành:
static void Foo(Reptile t) { }
Tại sao bạn không thể sắp xếp "kéo vào" các ràng buộc loại vào danh sách tham số chính thức? Điều này làm thay đổi chữ ký theo bất kỳ cách nào xấu? Tôi cảm thấy như nó chỉ tăng cường chữ ký. Sau đó, Foo<Reptile>
sẽ không bao giờ được coi là một ứng cử viên quá tải.
Chỉnh sửa 2: Không có gì lạ khi câu hỏi của tôi quá khó hiểu. Tôi đã không đọc đúng blog của Eric và tôi đã trích dẫn ví dụ sai. Tôi đã chỉnh sửa trong ví dụ tôi nghĩ thích hợp hơn. Tôi cũng đã thay đổi tiêu đề để cụ thể hơn. Câu hỏi này dường như không đơn giản như tôi tưởng tượng đầu tiên, có lẽ tôi đang thiếu một số khái niệm quan trọng. Tôi không chắc chắn rằng đây là tài liệu stackoverflow, nó có thể là tốt nhất cho câu hỏi này/thảo luận được di chuyển ở nơi khác.
Thông tin về Iguanas mà bạn trích dẫn ở đầu câu hỏi nhằm minh họa một tình huống mà suy luận kiểu * có ràng buộc trong tài khoản, cụ thể là ràng buộc trên T trong C và do đó phân giải quá tải sẽ chọn phương pháp * non generic * trong ví dụ này. Bạn có chắc chắn * đó là bit liên quan của bài viết mà bạn dự định trích dẫn để đặt câu hỏi này không? Phần còn lại của câu hỏi dường như không tuân theo logic từ nó. –
Tôi nghĩ rằng bạn dự định hỏi tại sao khi gõ suy luận * thành công * nhưng gây ra một loại vi phạm ràng buộc * trên tham số kiểu phương thức *, tại sao độ phân giải quá tải không thành công khi có thay thế. Tôi đang tìm câu hỏi này rất khó hiểu, nhưng sau đó một lần nữa, nó là một phần khó hiểu của đặc điểm kỹ thuật. –
Bạn nói đúng. Tôi đã đọc sai blog của bạn và sử dụng ví dụ sai. Không có thắc mắc câu hỏi của tôi đã rất bối rối. Tôi đã cố làm sáng tỏ câu hỏi của mình tốt nhất có thể; Tôi cũng sẽ đọc qua một số bài đăng trên blog khác của bạn để xem liệu tôi có thể cải thiện sự hiểu biết của mình về chủ đề này hay không. – Daryl