在f#中实现c#接口不能得到正确的类型

本文关键字:类型 不能 实现 接口 | 更新日期: 2023-09-27 18:03:40

我一直在试验f#,并认为,作为一个学习练习,我可以得到一个现有的c#项目,用f#版本一个接一个地替换类。当我尝试用f#"类"类型实现通用c#接口时,我遇到了麻烦。

c#接口
public interface IFoo<T> where T : Thing
    {
         int DoSomething<T>(T arg);
    }

尝试实现f#。我有不同的版本,这是最接近的(给我最少的错误消息)

type Foo<'T when 'T :> Thing> =
    interface IFoo<'T> with
        member this.DoSomething<'T>(arg) : int =
            45 
我现在得到的编译错误是:

成员'DoSomething<'T>: 'T -> int'没有正确的类型以覆盖相应的抽象方法。所需的签名是'DoSomething<'T>: 'T0 -> int'.

这让我很困惑。0是什么?更重要的是,我如何正确地实现这个成员?

在f#中实现c#接口不能得到正确的类型

首先,DoSomething的泛型参数在IFoo<T>接口上遮蔽了类型参数T。您可能打算使用:

public interface IFoo<T> where T : Thing
{
    int DoSomething(T arg);
}

一旦你这样做了,你可以实现接口:

type Foo<'T when 'T :> Thing> =
    interface IFoo<'T> with
        member this.DoSomething arg = 45

如果您确实打算在c#接口上遮蔽类型参数,则上述定义仍然有效,编译器将根据需要推断arg的类型为'a而不是T :> Thing