2014-10-10 12 views
7

Xem xét giao diện này:Tại sao `đơn vị` được xử lý khác nhau bởi hệ thống kiểu F # khi được sử dụng làm đối số chung cho giao diện?

type A<'a> = 
    abstract X : 'a 

Hãy cố gắng thực hiện nó với int như một cuộc tranh luận chung:

{ new A<int> with member this.X = 5 } // all is well 

Bây giờ, chúng ta hãy cố gắng unit cho một cuộc tranh cãi:

// Compiler error: The member 'get_X : unit -> unit' does not have the correct type to override the corresponding abstract method. 
{ new A<unit> with member this.X =() } 

Bây giờ, nếu chúng tôi xác định giao diện không chung chung, mọi thứ cũng hoạt động tốt:

type A_int = 
    abstract X : int 

{ new A_int with member this.X = 5 } // works 

type A_unit = 
    abstract X : unit 

{ new A_unit with member this.X =() } // works as well! 

Tôi có thể làm gì để khắc phục sự cố này không?

+0

Trong C# không thể có hàm chung trả về 'void' - xem ví dụ https://programmers.stackexchange.com/questions/131036/why-is-void-not-allowed-as-a- generic-type-in-c. Có thể các hạn chế tương tự đang được áp dụng cho mã F # trong trường hợp này. –

Trả lời

5

Trong F #, một khe trừu tượng có loại trả về được khai báo là unit được biên dịch trong .NET IL làm kiểu trả về là void. Ngược lại, một khe trừu tượng với kiểu trả về được khai báo là "T" được biên dịch trong .NET IL như kiểu trả về chung của "T", khi T được khởi tạo bởi unit trở thành unit'.

Xem: F# interface inheritance failure due to unit

0

bạn thành viên generic X có thể là một giá trị của bất kỳ loại. 'đơn vị' trong F # không thực sự là một loại (hoặc là loại rất đặc biệt nếu bạn muốn) - đó là sự vắng mặt của bất kỳ giá trị nào.

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