考虑这个界面:
type A<'a> =
abstract X : 'a
让我们尝试用int
作为通用参数来实现它:
{ new A<int> with member this.X = 5 } // all is well
现在,让我们试试unit
:
// 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 = () }
现在,如果我们定义一个非通用接口,那么一切也很好:
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!
我能解决这个问题吗?
答案 0 :(得分:5)
在F#中,声明返回类型为unit
的抽象槽在.NET IL中编译为返回类型void
。相反,一个抽象的槽,声明的返回类型为&#34; T&#34;在.NET IL中编译为&#34; T&#34;的通用返回类型,当unit
实例化T时,它变为unit'
。
答案 1 :(得分:0)
您的通用成员X可以是任何类型的值。 &#39;单元&#39;在F#中实际上并不是一种类型(或者如果你愿意,它是非常特殊的类型) - 它没有任何价值。