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#目前是否支持这些信息.如果有人知道,请告诉我.
如果我正确理解你的问题,答案是否定的。 规范的第 8.12.1 节(导入的 C# 扩展成员)包含以下文本:
\n\n\n\n\nC# 定义的扩展成员在引用 C# 编写的程序集且相应命名空间的开放声明有效的环境中可用于 F# 代码。但是,存在一些限制\n,特别是
\n\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# 代码
这解释了为什么 C# 中的某些扩展方法可以工作(例如 System.Linq 中的扩展方法),而您尝试使用的扩展方法却不能。
\n\n此外,本机 F# 扩展方法只能像放置在实际类型定义上一样进行定义。特别是,您不能在封闭泛型类型(例如IEnumerable<string>)上定义 F# 扩展方法,也不能在泛型类型变量上定义扩展方法。