代码之家  ›  专栏  ›  技术社区  ›  elmattic

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

  •  5
  • elmattic  · 技术社区  · 14 年前

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

    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 回复  |  直到 14 年前
        1
  •  5
  •   Brian    14 年前

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

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

        2
  •  3
  •   Chris Smith    14 年前

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

    不幸的是,为了解决你的问题,你可能不得不使用反射。