4

编译:

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. 类型参数缺少约束“当 ^T : (静态成员 ( >>> ) : ^T * int32 -> ^T)”

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

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

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

4

2 回答 2

8

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

let inline f< ^T when ^T : (static member op_RightShift : ^T * int -> ^T)> (x : ^T) =
    x >>> 1
于 2013-02-20T21:29:55.117 回答
6

你甚至需要一个明确的约束吗?这同样有效:

let inline f (x: ^T) : ^T = x >>> 1
于 2013-02-20T21:38:09.990 回答