2013-02-18 32 views
9

Trong C# 4.0 Spec 7.5.2.9:Upper-bound/Lower-ràng buộc Suy luận và sửa chữa

Một thấp-bound suy luận từ một loại U để một loại V được thực hiện như sau:

  • Nếu V là một trong những không cố định X i, sau đó U sẽ được thêm vào các thiết lập giới hạn thấp hơn cho X i.
  • [...]

Tôi đã đi qua phần này nhiều lần. Thiếu một tham chiếu phần, định nghĩa này đọc giống như một tham chiếu vòng tròn. Vì vậy, tôi mong đợi để tìm một sản xuất ngữ pháp hoặc tham khảo phần gần đó để làm rõ .. mà tôi không. Phần này cũng liên kết trong Sửa lỗi bị các vấn đề về định nghĩa tương tự.

upper-bound inference với số lower-bound inference là gì?

+1

Tôi không nghĩ rằng bạn có thể mất 7.5.2.9 trong sự cô lập. Bạn phải đảm nhận toàn bộ 7.5.2 để hiểu điều gì đang xảy ra. –

+0

@Damien_The_Unbeliever - Đó là loại-a những gì tôi sợ. Nó cảm thấy giống như một chương trình được viết sai. Tôi phải hiểu toàn bộ điều chỉ để đối phó với 1 tiểu mục. Tôi đã đọc qua 7.5.2 ... nhưng có quá nhiều thứ để xáo trộn trong đầu của tôi Xi Xj, U, V, giả định Chung ..... –

+0

7.5.2.9 không thực sự xác định suy luận giới hạn thấp hơn * *Là**. Đó là một tập hợp các hướng dẫn cho những gì bạn định làm khi bạn tìm thấy (ở bất kỳ đâu trong 7.5.2) hướng dẫn ví dụ: "một suy luận giới hạn dưới được tạo từ U đến T". Và sau đó 7.5.2.11 cho bạn biết cách ** các suy luận này được sử dụng như thế nào. –

Trả lời

5

Tôi sẽ cố gắng hết sức để mô tả rõ ràng hơn. Trường hợp xấu nhất, tôi mô tả nó khác nhau.

Suy luận trên/dưới là một phần của cách tiếp cận từng giai đoạn để suy luận kiểu đối với các đối số kiểu được sử dụng cho một cuộc gọi phương thức chung cụ thể. Rõ ràng, suy luận trên/dưới sẽ không được áp dụng nếu trong pha đầu tiên nếu đối số (E) được nhập một cách rõ ràng. ví dụ:

cho

public static T Choose<T>(T first, T second) { 
     return (rand.Next(2) == 0)? first: second; 
    } 

Tôi có thể gọi Choose với đối số kiểu tường minh:

Choose<String>("first", "second"); 

liên quan đến các suy luận thượng hoặc thấp hơn giới hạn Với, có một số ý nghĩa trong suốt 7.5.2 quyết định liệu suy luận thấp hơn hay giới hạn trên có thể áp dụng được hay không. Ví dụ: 7.5.2.9 (và .10) chi tiết rằng thông số loại là không được gắn để suy luận ở trên hoặc dưới giới hạn xảy ra. 7.5.2.5 chi tiết rằng một tham số kiểu chỉ được bỏ cố định khi tham số kiểu đó phụ thuộc vào một tham số kiểu không được cố định khác. Ví dụ

IEnumerable<TResult> Select<TSource, TResult>(IEnumerable<TSource> e, 
    Func<TSource, Result> f) 

TResult "phụ thuộc vào" TSource, bởi vì loại TSource có thể có thể xác định loại TResult. ví dụ. với một cuộc gọi như Select(c, e->Name), TResult tùy thuộc vào loại Name trong TSource.

Xét về tham số giới hạn trên và dưới, cho tham số kiểu không có sẵn (X) có loại (V) không được khai báo rõ ràng (xem đoạn đầu tiên), trên hoặc giới hạn dưới của đối số kiểu (E) của loại U được suy luận. Nếu tham số kiểu là covariant (có out bổ trợ) và một trong các kiểu trong nhóm giới hạn dưới là một ứng cử viên cho tham số, thì một suy luận bị giới hạn dưới xảy ra. Ngược lại, nếu tham số kiểu là contravariant (có 'trong' sửa đổi) và một trong các kiểu trong tập hợp giới hạn trên là một ứng cử viên cho tham số, thì một suy luận giới hạn trên xảy ra. ví dụ.với Select(c, e->e.Name)cIEnumerable<Mammal> sau đó trình biên dịch sẽ suy ra một thấp ràng buộc của Mammal vì tham số gõ vào IEnumerable là hiệp biến (ví dụ như nó tuyên bố IEnumerable<out T>. Nếu nó đã được tuyên bố IEnumerable<in T> sau đó một thượng-bound sẽ được suy ra. Và nếu nó là tuyên bố Enumerabale<T> --with không in hoặc out sau đó nó sẽ là bất biến và không phải suy luận thượng cũng không thấp hơn giới hạn sẽ được áp dụng.)

rõ ràng, nếu loại tham số có thể không phải hiệp biến cũng không contravariant sau đó là một trận đấu chính xác phải xảy ra

+0

Làm thế nào mà bạn biết điều này? –

+0

Giải thích tuyệt vời Peter. –

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