支持成员约束的静态扩展方法

时间:2010-09-09 22:54:26

标签: f# extension-methods type-constraints

我需要实现一个静态扩展方法,支持对一些基本原始类型(如整数,浮点数等)的成员约束。这是我的有符号整数的代码:

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'的运算符

我在这里缺少什么?谢谢!

2 个答案:

答案 0 :(得分:5)

F#中的静态成员约束永远不会找到'扩展方法',它们只能看到类型的内部方法(以及在F#语言规范中调用的一些特殊情况)。

也许您可以使用方法重载?你的最终目标是什么?

答案 1 :(得分:3)

F#的静态类型约束不适用于扩展方法。在编译时无法静态检查扩展方法,即使如此,您可以为Int32 :: Foo定义多个定义(取决于您导入的命名空间)。

不幸的是,要解决您的问题,您可能不得不求助于使用反射。