4

私は次のタイプを持っています

type StatusCode = 
    | OK          = 200
    | NoContent   = 204
    | MovedTemp   = 301
    | MovedPerm   = 302
    | SeeOther    = 303
    | NotModified = 304
    | NotFound    = 404
    | ServerError = 500

[<Literal>]
let NoBodyAllowedStatusCodes = [StatusCode.NoContent; StatusCode.NotModified]

そして、次のようなコンパイル時エラーが発生します。

これは有効な定数式またはカスタム属性値ではありません

ここで何が問題なのか本当にわかりません。

4

1 に答える 1

6

F# および一般的な .NET では、リストをリテラルにすることはできません (C#/VB.NET では定数)。string、 などのプリミティブ値のみを使用できますbool。F# 3.0 仕様には、セクション 10.2.2 でリテラルにできるものとできないものに関するガイドラインがあります。

Literal 属性を持つ値には、次の制限があります。

  • ミュータブルまたはインラインとしてマークされていない場合があります。
  • また、ThreadStatic または ContextStatic 属性がない場合もあります。
  • 右側の式は、次のいずれかで構成されるリテラル定数式でなければなりません。
  • ()、ネイティブ整数リテラル、符号なしネイティブ整数リテラル、バイト配列リテラル、BigInteger リテラル、およびユーザー定義の数値リテラルを除く単純な定数式。

—または—</p>

  • 別のリテラルへの参照。

letしようとしていることに応じて、バインディングがクラスで使用されている場合、リストを静的にすることができます。Literalそれがモジュール内にある場合は、let バインディングはデフォルトで不変であるため、属性を削除するだけです。

于 2015-03-30T14:45:37.183 に答える