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 回答