我有以下类型的
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中是常量)。只有基元值可以,如string
、bool
等。F#3.0规范在10.2.2:中有关于什么可以是文字或不能是文字的指导原则
具有Literal属性的值受以下限制:
- 它不能标记为可变或内联
- 它可能也没有ThreadStatic或ContextStatic属性
- 右侧表达式必须是一个文字常量表达式,该表达式由以下任意一个组成:
- 一个简单的常量表达式,但()、本机整数文本、无符号本机整数文学、字节数组文学、BigInteger文学和用户定义的数字文学除外
--或--
- 对另一个文字的引用
如果在类中使用let
绑定,则可以使列表为静态,具体取决于您尝试执行的操作。如果它在模块中,我只需要删除Literal
属性,因为let绑定在默认情况下是不可变的。