2

我基本上是在问为什么以下代码行无法编译:

type IGenericType<'a> = 
    abstract member MyFunc : 'a -> 'a -> 'a

type Implementer() = 
    member x.Test () () = () // unit->unit->unit
    interface IGenericType<unit> with 
        member x.MyFunc a b = b // FS0017
        // member x.MyFunc () () = () // FS0017

只是好奇是否有一种方法可以使这项工作按预期进行。我认为这是一个限制,它与单元和泛型的实现有关。

我目前使用以下解决方法:

type Nothing = 
    | Nothing
type Implementer() = 
    interface IGenericType<Nothing> with 
        member x.MyFunc a b = b

希望有人可以为这种行为带来一些启示。

4

1 回答 1

2

你猜对了。对于 .NET 框架内的互操作性,F# 编译器不会发出 ILunit而是将其替换为void

因此,您的通用接口适用于除unit. 这似乎不是什么大问题;您的解决方法是解决此问题的好方法。

更详细的讨论可以在F# interface inheritance failure due to unit中找到。

于 2012-04-04T13:43:55.423 回答