60

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êm string vào giới hạn dưới cho T, 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ậy T 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?

+18

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. –

+5

@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

+7

Đầu tôi đau ... – Rusty

Trả lời

39

CẬP NHẬT: Điều tra ban đầu của tôi trên xe buýt sáng nay là không đầy đủ và sai. Văn bản của đặc tả giai đoạn đầu tiên là chính xác. Việc thực hiện là chính xác.

Thông số sai ở chỗ nó nhận thứ tự các sự kiện sai trong giai đoạn thứ hai. Chúng ta nên xác định rằng chúng ta đưa ra các tham chiếu kiểu đầu ra trước chúng ta sửa các tham số không phụ thuộc.

Con người, nội dung này phức tạp. Tôi đã viết lại phần này của thông số kỹ thuật nhiều lần hơn tôi có thể nhớ.

Tôi đã thấy vấn đề này trước đây và tôi nhớ rõ ràng việc sửa đổi sao cho cụm từ "biến loại" không chính xác được thay thế ở mọi nơi bằng "tham số kiểu". (Các tham số kiểu không phải là các vị trí lưu trữ có nội dung có thể khác nhau, do đó, không có ý nghĩa gì khi gọi chúng là các biến.) Tôi nghĩ đồng thời tôi lưu ý rằng thứ tự đã sai. Có lẽ những gì đã xảy ra là chúng tôi vô tình chuyển một phiên bản cũ của thông số kỹ thuật trên web. Nhieu loi xin loi.

Tôi sẽ làm việc với Mads để nhận thông số được cập nhật để phù hợp với việc triển khai. Tôi nghĩ rằng cách diễn đạt đúng trong giai đoạn thứ hai nên đi một cái gì đó như thế này:

  • Nếu không có tham số kiểu không cố định tồn tại sau đó gõ suy luận thành công.
  • Ngược lại, nếu có tồn tại một hoặc nhiều đối số Ei với tương ứng kiểu tham số Ti mà loại sản lượng Ei với kiểu Ti chứa ít nhất một tham số loại không cố định Xj, và không ai trong số các loại đầu vào của Ei với loại Ti chứa bất kỳ thông số loại không được cố định Xj, thì suy luận kiểu đầu ra được tạo từ tất cả các Ei như vậy thành Ti.

hay không bước trước thực sự thực hiện một suy luận, chúng tôi bây giờ phải sửa chữa ít nhất một tham số kiểu, như sau:

  • Nếu có tồn tại một hoặc nhiều tham số loại Xi mà Xi không có sẵn, và Xi có một tập hợp giới hạn không trống, và Xi không phụ thuộc vào bất kỳ Xj sau đó mỗi Xi đó được sửa. Nếu bất kỳ thao tác sửa lỗi nào không thành công thì suy luận kiểu không thành công.
  • Ngược lại, nếu có tồn tại một hoặc nhiều tham số loại Xi mà Xi là không cố định, và Xi có một tập không rỗng giới hạn, và có ít nhất một tham số kiểu Xj mà phụ thuộc vào Xi sau đó mỗi Xi như vậy là cố định. Nếu bất kỳ thao tác sửa lỗi nào không thành công thì suy luận kiểu không thành công.
  • Nếu không, chúng tôi không thể tiến hành và có thông số chưa được trộn. Không thể nhập suy luận.

Nếu suy luận kiểu không thành công hoặc không thành công thì giai đoạn thứ hai được lặp lại.

Ý tưởng ở đây là chúng tôi muốn đảm bảo rằng thuật toán không bao giờ đi vào vòng lặp vô hạn. Tại mọi sự lặp lại của giai đoạn thứ hai, nó thành công, thất bại hoặc tiến bộ. Nó không thể lặp lại nhiều lần hơn là có các tham số kiểu để sửa các kiểu.

Cảm ơn vì đã chú ý đến điều này.

+0

Vâng, điều đó có ý nghĩa bây giờ. – Gabe

+0

OK, tôi đã thử nhiều trường hợp khác nhau và phiên bản này dường như hoạt động. Bây giờ tôi sẽ chấp nhận câu trả lời này, nhưng tôi sẽ quay trở lại nếu tôi gặp nhiều vấn đề hơn ... ☺ – Timwi

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