2010-07-09 26 views
12

Bất cứ ai có thể giải thích tại sao ví dụ thứ hai bên dưới sẽ không biên dịch?Tại sao 'Mã không đủ chung'?

'Kiểm tra 2' cung cấp cho "lỗi FS0670: Mã này không đủ chung chung. Biến kiểu^a không thể tổng quát được vì nó sẽ thoát khỏi phạm vi của nó.". Tôi không hiểu thông báo lỗi này.

// Test 1 
type test1<'a> = | A of 'a 
    with 
    override t.ToString() = 
     match t with 
     | A a -> a.ToString() 

// Test 2 
type test2<'a> = | A of 'a 
    with 
    override t.ToString() = 
     match t with 
     | A a -> string a 

// Test 3 
type test3<'a> = | A of 'a 
    with 
    override t.ToString() = 
     match t with 
     | A a -> string (a :> obj) 

Trả lời

5

Dưới đây là repro khác:

let inline f< ^T>(x:^T) = box x 

type test4<'a> = | A of 'a 
    with 
    member t.M() = 
     match t with 
     | A a -> f a 

string là một hàm nội tuyến có sử dụng hạn chế loại tĩnh, và chẩn đoán lỗi cho các chức năng như vậy đôi khi người nghèo. Tôi không thực sự hiểu chính xác thông báo chẩn đoán, nhưng vấn đề là, tại trang web cuộc gọi, chúng tôi không biết loại chung 'a, có nghĩa là chúng tôi không thể phiên bản đúng của cuộc gọi tới string (hoặc f trong repro của tôi). Ví dụ: trường hợp bạn upcast đến obj, chúng tôi biết rằng chúng tôi muốn nội tuyến phiên bản obj của string, vì vậy đó là ok.

0

Tôi tưởng tượng bởi vì chuỗi có chữ ký (obj -> string) nên việc sử dụng chuỗi của chính nó là bắt buộc phải gõ obj. (F # không làm phôi ngầm.)

+1

'chuỗi' [thực tế là '' T -> chuỗi'] (http://msdn.microsoft.com/en-gb/library/ee340491.aspx), vì vậy điều này sẽ hoạt động theo lý thuyết. Tôi không có một lời giải thích tốt hơn cho các lỗi mặc dù. –

+0

Ồ vâng, tôi chỉ bị mắc kẹt chuỗi ;; vào F # tương tác để có được loại. Có lẽ thực sự sử dụng chuỗi là buộc biên dịch buộc một loại trên đầu vào, và nó chọn obj là mẫu số chung thấp nhất? – Massif

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