编译:
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
错误:
- 尝试将其解析为运算符名称,但失败
- 成员签名中出现意外的符号">"。应为")"或其他标记
- 类型参数缺少约束"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