C# language specification mô tả suy luận kiểu trong Mục §7.5.2. Có một chi tiết trong đó mà tôi không hiểu. Hãy xem xét các trường hợp sau đây:Sự cố khi hiểu suy luận kiểu C# như được mô tả trong đặc tả ngôn ngữ
// declaration
void Method<T>(T obj, Func<string, T> func);
// call
Method("obj", s => (object) s);
Cả Microsoft và Mono C# biên dịch một cách chính xác suy T
= object
, nhưng sự hiểu biết của tôi về các thuật toán trong đặc tả sẽ mang lại T
= string
và sau đó thất bại. Dưới đây là cách tôi hiểu nó:
Giai đoạn đầu
Nếu Ei là một chức năng ẩn danh, một rõ ràng kiểu tham số suy luận (§7.5.2.7) được làm từ Ei để Ti
⇒ không có hiệu lực, vì biểu thức lambda không có loại tham số rõ ràng. Đúng?
Nếu không, nếu Ei có loại U và xi là tham số giá trị thì suy luận giới hạn dưới được tạo từ U đến Ti.
⇒ thông số đầu tiên là loại tĩnh
string
, vì vậy, điều này sẽ thêmstring
vào giới hạn dưới choT
, phải không?
Giai đoạn thứ hai
Tất cả không cố định loại biến Xi mà không phụ thuộc vào (§7.5.2.5) bất kỳ Xj là cố định (§7.5.2.10).
⇒
T
không được cố định;T
không phụ thuộc vào bất cứ điều gì ... vì vậyT
phải được sửa, phải không?
§7.5.2.11 Sửa
Tập hợp các loại ứng cử viên Uj bắt đầu ra như các thiết lập của tất cả các loại trong tập hợp các giới hạn cho Xi.
⇒ {
string
(thấp bound)}Sau đó chúng tôi kiểm tra từng ràng buộc cho Xi lần lượt: [...] Đối với mỗi U thấp hơn ràng buộc của Xi tất cả các loại Uj mà không có một chuyển đổi ngầm từ U bị xóa khỏi nhóm ứng cử viên. [...]
⇒ không xóa bất kỳ thứ gì khỏi nhóm ứng cử viên, phải không?
Nếu trong số các loại ứng cử viên còn lại Uj có một loại V duy nhất từ đó có chuyển đổi ẩn đối với tất cả các loại ứng cử viên khác, thì Xi được cố định thành V.
⇒ Vì chỉ có một loại ứng cử viên, điều này là không đúng, nên Xi được cố định thành
string
. Đúng?
Vì vậy, nơi tôi đi sai?
Um ... Hmm. Bạn có thể đã tìm thấy một lỗi. Hoặc trong thông số kỹ thuật hoặc trong quá trình triển khai. Tôi sẽ xem xét nó khi tôi đang ở bàn làm việc của tôi vào thứ hai; ngay bây giờ tôi phải nấu bữa tối. –
@Eric - OK ... chúng tôi sẽ cho phép bạn ăn tối nhưng chúng tôi cần câu trả lời nhanh vào sáng thứ Hai. :) – ChaosPandion
Đầu tôi đau ... – Rusty