F# 在F中实现C#接口#

F# 在F中实现C#接口#,f#,F#,我在C中有以下接口# 公共接口IDog { 弦树皮(); } 我想在F#中创建一个实现。我对此没有问题: type GermanShepherd() = interface IDog with member this.Bark() = "Woof" 但是,当我添加了一个支持函数时,它不是界面的一部分,如下所示: type GermanShepherd() = interface IDog with membe

我在C中有以下接口#

公共接口IDog
{
弦树皮();
}
我想在F#中创建一个实现。我对此没有问题:

type GermanShepherd() = 
        interface IDog with
            member this.Bark() = "Woof"
但是,当我添加了一个支持函数时,它不是界面的一部分,如下所示:

type GermanShepherd() = 
        interface IDog with
            member this.Bark() = "Woof"
            member this.Eat() = "Yummy" 
编辑抱怨说:

错误1未找到与此重写对应的抽象或接口成员
错误2此值不是函数,无法应用*

是否有一种实现私有/内部函数的方法,其类型实现了接口,而这些函数不属于接口的一部分?我不能在我的“真实”应用程序b/c中更改接口,还有其他项目实现了该接口。我发现的MSDN上的示例都没有这种特殊情况。

接口块应仅包含作为接口一部分的函数,但您可以在块之前放置其他函数:

type GermanShepherd() = 
    member this.Eat() = "Yummy" 
    interface IDog with
        member this.Bark() = "Woof"
如果不需要公共成员,则可以使用私有let绑定函数:

type GermanShepherd() = 
    let eat() = "Yummy" 
    interface IDog with
        member this.Bark() = "Woof"
还请注意,F#目前只允许显式接口实现,这意味着您可以将
GermanShepherd
视为
IDog
,但不会显式看到
IDog
成员:

let g = GermanShepherd()
g.Eat()            // OK
g.Bark()           // Error, interface members are implemented explicitly
let d = g :> IDog  // To 'Bark', we need to get 'IDog' first
d.Bark()           // OK

解决方法之一是将
Bark
方法显式添加为
接口
块之外的单独成员。虽然这也有原因

这很有效,我会用它。我确实注意到,它违反了下台规则,即私人/支持职能低于公共职能。谢谢您也可以将成员放在接口块之后,尽管私有let绑定的情况并非如此。@JamieDixon在F#中,私有/支持函数几乎总是优先于公共函数-如果它们是let绑定函数,就必须这样做。由于F#编译器严格地从上到下工作,所以降压规则不能真正应用于F#代码。谢谢。我真的不得不强迫自己在使用F时忘记C#idom。