我有以下类型
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]
我收到的编译时错误是:
这不是有效的常量表达式或自定义属性值
我无法弄清楚这里有什么问题。
答案 0 :(得分:6)
在F#和.NET中,列表不能是文字(在C#/ VB.NET中是常量)。只有原始值可以,例如string
,bool
等.F#3.0规范在第10.2.2节中有关于什么可以是或不可以是文字的指南:
具有Literal属性的值受以下限制约束:
- 它可能没有标记为可变或内联。
- 它可能也没有ThreadStatic或ContextStatic属性。
- 右侧表达式必须是由以下任一项组成的文字常量表达式:
- 一个简单的常量表达式,除了(),本机整数文字,无符号本机整数文字,字节数组文字,BigInteger文字和用户定义的数字文字。
-OR -
- 对另一个文字的引用。
根据您要执行的操作,如果在类中使用let
绑定,则可以使列表保持静态。如果它在一个模块中,我只需删除Literal
属性,因为默认情况下,绑定是不可变的。无论如何。