静态类型变量,成员约束,编译器错误? (“尝试将其解析为运营商名称,但失败了”)

时间:2013-02-20 21:20:19

标签: f# inline f#-3.0

编译:

let inline f< ^T when ^T : (static member (<<<) : ^T * int -> ^T) > (x : ^T) = x <<< 1

不编译:

let inline f< ^T when ^T : (static member (>>>) : ^T * int -> ^T) > (x : ^T) = x >>> 1

错误:

  1. 尝试将其解析为运营商名称,但未通过
  2. 意外的符号&#39;&gt;&#39;在会员签名中。期待&#39;)&#39;或其他令牌。
  3. 类型参数缺少约束&#39;当^ T :(静态成员(&gt;&gt;&gt;):^ T * int32 - &gt; ^ T)&#39;
  4. 添加空格并没有帮助;此行产生相同的编译器错误:

    let inline f< ^T when ^T : (static member ( >>> ) : ^T * int -> ^T) > (x : ^T) = x >>> 1
    

    我已经搜索了文档和规范,但没有用。这是一个错误吗?有没有办法在成员签名中包含>个字符?

2 个答案:

答案 0 :(得分:8)

当然看起来像个臭虫。这很难看,但一种解决方法是使用运算符名称的长形式:

let inline f< ^T when ^T : (static member op_RightShift : ^T * int -> ^T)> (x : ^T) =
    x >>> 1

答案 1 :(得分:6)

你甚至需要明确的约束吗?这也适用:

let inline f (x: ^T) : ^T = x >>> 1