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:(static member(>>>):^ T * int32-> ^ T)'の場合、型パラメーターに制約がありません。

スペースを追加しても役に立ちません。この行では、同じコンパイラエラーが発生します。

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

ドキュメントと仕様の両方を検索しましたが、役に立ちませんでした。これはバグですか?>メンバーの署名に文字を含める方法はありますか?

4

2 に答える 2

8

確かにバグのように見えます。見苦しいですが、回避策の 1 つは、長い形式のオペレーター名を使用することです。

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 に答える