在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
我现在得到的编译错误是:
这让我很困惑。0是什么?更重要的是,我如何正确地实现这个成员?成员'DoSomething<'T>: 'T -> int'没有正确的类型以覆盖相应的抽象方法。所需的签名是'DoSomething<'T>: 'T0 -> int'.
首先,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
。