2010-09-02 30 views
5

Tôi đang gọi các hàm trong khung XNA từ F # chấp nhận các giá trị Nullable. Bây giờ, trong C#, bạn sẽ chỉ cần gọi:Nullablle <> 's và "null" trong F #

foo(arg1, arg2, null, arg4) 

Bây giờ, tôi đã thử điều đó trong F # nhưng không thích. Nó nói: "Lỗi 9 Loại ràng buộc không khớp. Loại 'a không tương thích với kiểu System.Nullable Loại' System.Nullable 'không có' null 'làm giá trị thích hợp."

Tôi hiểu tại sao điều này xảy ra, sắp xếp, nhưng có vẻ như thực sự bất tiện. Tất cả những gì tôi đang làm bây giờ là làm cho cuộc sống dễ dàng hơn, thay vì gõ liên tục (Nullable<Rectangle>)null mỗi lần tôi gọi hàm, tôi chỉ thực hiện let nullRect = (Nullable<Rectangle>)null và sử dụng nullRect. Điều này có vẻ thực sự ngu ngốc, đặc biệt là kể từ khi tôi phải làm điều đó cho tất cả các loại nullable tôi tương tác với. Có cách nào tốt hơn, thành ngữ hơn để xử lý việc này không?

Trả lời

3

Đây là những gì tôi muốn làm:

[<GeneralizableValue>] 
let nl<'a when 'a : struct 
      and 'a : (new : unit -> 'a) 
      and 'a :> System.ValueType> : System.Nullable<'a> = 
    unbox null 

Bây giờ bạn có thể sử dụng bất cứ nơi nào nl bạn đã có thể sử dụng null trước.

EDIT

Như Tomas lưu ý, điều này có thể được viết nhiều hơn nữa ngắn gọn như sau:

let nl = System.Nullable<_>() 
+1

Như một lưu ý phụ, điều này có thể được đơn giản hóa thành '[] cho nl = System.Nullable <_>()'. F # có thể suy ra phần còn lại của chữ ký. –

+0

Điều đó thực sự gọn gàng! Tôi chưa có cơ hội thử viết tắt của Tomas. Cám ơn vì sự gợi ý! – Perrako

+0

@Tomas - bắt tốt, trông đẹp hơn nhiều. – kvb

3

Nếu bạn không muốn sử dụng câu trả lời rất thông minh kvb, trong nhiều trường hợp, bạn có thể bỏ qua loại cụ thể và chỉ sử dụng Nullable<_>() - F # có thể suy ra loại Nullable bạn muốn nói.

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