2013-01-22 29 views
6

Tôi vừa nhận thấy một hành vi trực quan khá ngược lại khi phần trường của bản ghi F # được khai báo riêng. (Điều này có liên quan đến Is it possible to make a field of a record private? or to make a member of record private?)Phạm vi trợ năng lạ khi các trường của bản ghi F # được khai báo riêng

Trong ví dụ này ...

type MyRec = 
    private // Fields declared private, or at least I thought so. 
     { a : int 
      b : int } 
    member x.A = x.a 
    member private x.Both = x.a + x.b 
    static member CreateMyRec(a, b) = { a = a; b = b } 

let foo = MyRec.CreateMyRec(1,2) 
let bar = foo.a  // No error. Huh? 
let baz = foo.Both // Error: not accessible. 

... các thành viên tin Both là không thể tiếp cận bên ngoài phạm vi khai báo kiểu, như dự kiến. Tuy nhiên, trường có thể truy cập được a.

Nếu bạn đặt MyRec trong một mô-đun, các trường sẽ trở thành riêng tư cho mô-đun đó. Đó là cách bạn mong đợi một khai báo mức cao nhất trong mô-đun để hoạt động, nhưng tôi mong rằng bất cứ điều gì được khai báo riêng trong một loại, sẽ là riêng tư cho kiểu đó, không phải với mô-đun kèm theo của nó.

Hành vi này có thực sự kỳ lạ không, hoặc tôi có thiếu thứ gì đó trong lý do của tôi ở đây không?

Trả lời

10

Theo như tôi có thể biết, đây là một tính năng không được ghi chép. Nhưng, phần 10,5 của spec, Accessibility Annotations, khẳng định:

tin trên một loại, mô-đun, hoặc loại đại diện trong một module có nghĩa

"loại đại diện" là “tin tới các mô-đun.” phần liên quan đến các trường bản ghi.

+0

Đó là một cách tinh tế. Sẽ không bao giờ nhận thấy nó mà không có câu trả lời của bạn. –

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