我需要实现一个静态扩展方法,支持对一些基本原始类型(如整数,浮点数等)的成员约束。这是我的有符号整数的代码:
module MyOperators =
let inline foo (x : ^T) = (^T : (static member Foo : ^T -> int) (x))
type System.Int32 with
static member Foo(x : Int32) = 7 // static extension
测试代码:
open MyOperators
let x = foo 5 // x should be 7
但编译器抱怨错误:
“System.Int32”类型没有 支持任何名为'Foo'的运算符
我在这里缺少什么?谢谢!
答案 0 :(得分:5)
F#中的静态成员约束永远不会找到'扩展方法',它们只能看到类型的内部方法(以及在F#语言规范中调用的一些特殊情况)。
也许您可以使用方法重载?你的最终目标是什么?
答案 1 :(得分:3)
F#的静态类型约束不适用于扩展方法。在编译时无法静态检查扩展方法,即使如此,您可以为Int32 :: Foo定义多个定义(取决于您导入的命名空间)。
不幸的是,要解决您的问题,您可能不得不求助于使用反射。