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

时间:2015-03-30 14:40:13

标签: 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]

我收到的编译时错误是:

  

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

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

1 个答案:

答案 0 :(得分:6)

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

  

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

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

-OR -

     
      
  • 对另一个文字的引用。
  •   

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