2011-12-28 49 views
5

Khi phát triển ứng dụng F #, tôi có loại bao gồm thuộc tính loại Lazy<'T>. Rõ ràng, một hiệu ứng phụ thú vị (Pardon the pun) của cách F # xử lý đường cú pháp của các thuộc tính (trái ngược với cách C#) là getter và setter của một thuộc tính có thể trả về/chấp nhận khác nhau loại. (. Ít nhất, Visual Studio không hề phàn nàn khi tôi viết mã để tận dụng những quan sát này)Thuộc tính F # so với thuộc tính C#

Ví dụ, đó là thuận lợi cho tôi để làm điều này:

let lazyValue = lazy 0 

member this.Value 
    with get() = 
     lazyValue.Value 
    and set _lazyVal = 
     lazyValue <- _lazyVal 

... như vậy mà giá trị gia tăng trả lại an int, nhưng chỉ chấp nhận chỉ một Lazy<int>.

Điều tôi đang phân vân là những sự phản đối lý thuyết, thành ngữ và thực tiễn để làm những việc theo cách này. Đây có phải là thứ mà F # snob sẽ bật mũi lên không? Có một số quy tắc lập trình chức năng của ngón tay cái rằng điều này (thực hiện hướng đối tượng) rõ ràng vi phạm? Đây có phải là một cách tiếp cận đã được chứng minh là gây ra các vấn đề trong các ứng dụng quy mô lớn không? Nếu vậy, tại sao/như thế nào?

+3

Điều này được cho phép là một lỗi trong trình biên dịch F # - F # spec nói rằng đó là bất hợp pháp. Mong đợi điều này không còn hoạt động trong các phiên bản F # trong tương lai nữa. : -] – ildjarn

Trả lời

5

Có lẽ đó là lỗi "Visual Studio không phàn nàn là [bạn] viết mã tận dụng lợi thế của quan sát này". Xem Using F# Option Type in C#

Một bình luận trong câu trả lời cho các ghi chú câu hỏi liên quan:

Từ phần 8.13.1 của spec: Nếu một thành viên bất động sản có cả một getter và setter, và không phải là một indexer, sau đó chữ ký của cả hai getter và setter phải ngụ ý cùng một loại tài sản

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