静态类型变量、成员约束、编译器错误?( "Attempted to parse this as an operator name, but failed" )



编译:

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. 成员签名中出现意外的符号">"。应为")"或其他标记
  3. 类型参数缺少约束"when^T:(静态成员(>>>):^T*int32->^T)"

添加空格没有帮助;这一行产生了相同的编译器错误:

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

我搜索了文档和规范,但都没有结果。这是个虫子吗?有没有办法在会员签名中包含>字符?

看起来确实像个bug。这很难看,但有一种解决方法是使用操作员名称的长形式:

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

您甚至需要显式约束吗?这同样有效:

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

相关内容

最新更新