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

Ove*_*ive 4 f# compile-time-constant constant-expression

我有以下几种类型

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]
Run Code Online (Sandbox Code Playgroud)

我得到一个编译时错误,说:

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

我无法弄清楚这里有什么问题.

vcs*_*nes 6

在F#和.NET中,列表不能是文字(在C#/ VB.NET中是常量).只有原始值可以像string,bool等F#3.0规范有什么可以或不可以在10.2.2节文字的指导方针:

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

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

-要么-

  • 对另一个文字的引用.

根据您要执行的操作,如果let在类中使用绑定,则可以使列表成为静态.如果它在一个模块中,我只是删除该Literal属性,因为默认情况下,绑定是不可变的.