无法在F#中创建列表文字



我有以下类型的

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]

我收到一个编译时错误,上面写着:

这不是有效的常量表达式或自定义属性值

我真的搞不清楚这里出了什么问题。

在F#和.NET中,列表不能是文字(在C#/VB.NET中是常量)。只有基元值可以,如stringbool等。F#3.0规范在10.2.2:中有关于什么可以是文字或不能是文字的指导原则

具有Literal属性的值受以下限制:

  • 它不能标记为可变或内联
  • 它可能也没有ThreadStatic或ContextStatic属性
  • 右侧表达式必须是一个文字常量表达式,该表达式由以下任意一个组成:
  • 一个简单的常量表达式,但()、本机整数文本、无符号本机整数文学、字节数组文学、BigInteger文学和用户定义的数字文学除外

--或--

  • 对另一个文字的引用

如果在类中使用let绑定,则可以使列表为静态,具体取决于您尝试执行的操作。如果它在模块中,我只需要删除Literal属性,因为let绑定在默认情况下是不可变的。

最新更新