是否可以在F#中定义通用扩展方法?

Vag*_*lov 5 extension-methods f#

我试图使用带有F#代码的Rhino Mocks,以下代码是有问题的:

let service = MockRepository.GenerateMock<IMyService>()
service.Stub(s => s.Name).Return("Service");
Run Code Online (Sandbox Code Playgroud)

这并不奇怪,因为Stub不是IMyService接口的一部分,它是Rhino Mocks定义的C#扩展方法.

Slighltly修改代码的工作原理:

let service = MockRepository.GenerateMock<IMyService>()
RhinoMocksExtensions.Stub<IMyService, string>(service, fun s -> s.Name).Return("Service");
Run Code Online (Sandbox Code Playgroud)

但是,在F#中定义扩展方法会很好,但是它将是一个参数化的通用扩展方法,它将采用元组.我正在尝试varios语法,但没有任何运气.我没有找到F#目前是否支持这些信息.如果有人知道,请告诉我.

kvb*_*kvb 3

如果我正确理解你的问题,答案是否定的。 规范的第 8.12.1 节(导入的 C# 扩展成员)包含以下文本:

\n\n
\n

C# 定义的扩展成员在引用 C# 编写的程序集且相应命名空间的开放声明有效的环境中可用于 F# 代码。但是,存在一些限制\n,特别是

\n\n
    \n
  • \xe2\x80\x9cthis\xe2\x80\x9d\n 参数为变量类型的 C# 扩展成员不可用于此版本的 F# 中的 F# 代码\n

  • \n
  • \xe2\x80\x9cthis\xe2\x80\x9d\n 参数为数组类型的 C# 扩展成员不可用于此\n 版本的 F# 中的 F# 代码

  • \n
\n
\n\n

这解释了为什么 C# 中的某些扩展方法可以工作(例如 System.Linq 中的扩展方法),而您尝试使用的扩展方法却不能。

\n\n

此外,本机 F# 扩展方法只能像放置在实际类型定义上一样进行定义。特别是,您不能在封闭泛型类型(例如IEnumerable<string>)上定义 F# 扩展方法,也不能在泛型类型变量上定义扩展方法。

\n