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

pho*_*oog 4 f# inline f#-3.0

编译:

let inline f< ^T when ^T : (static member (<<<) : ^T * int -> ^T) > (x : ^T) = x <<< 1
Run Code Online (Sandbox Code Playgroud)

不编译:

let inline f< ^T when ^T : (static member (>>>) : ^T * int -> ^T) > (x : ^T) = x >>> 1
Run Code Online (Sandbox Code Playgroud)

错误:

  1. 尝试将其解析为运营商名称,但失败了
  2. 成员签名中出现意外的符号">".预期')'或其他令牌.
  3. 类型参数缺少约束'when ^ T :(静态成员(>>>):^ T*int32 - > ^ T)'

添加空格无济于事; 此行产生相同的编译器错误:

let inline f< ^T when ^T : (static member ( >>> ) : ^T * int -> ^T) > (x : ^T) = x >>> 1
Run Code Online (Sandbox Code Playgroud)

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

kvb*_*kvb 8

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

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


Dan*_*iel 6

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

let inline f (x: ^T) : ^T = x >>> 1
Run Code Online (Sandbox Code Playgroud)