为什么这样可以:
let [<Literal>] hi = "hi"
let [<Literal>] bye = "bye"
let [<Literal>] shortMeeting = hi + bye
......但这不是?
let [<Literal>] me = 1
let [<Literal>] you = 1
let [<Literal>] we = me + you
第三行给出错误:
This is not a valid constant expression
该怎么做?
答案 0 :(得分:7)
所以spec / docs有点不清楚,但提供提示。
从规范(对于F#3.0):
具有Literal属性的值受以下条件限制 限制:
它可能没有标记为可变或内联。它可能也没有 ThreadStaticor ContextStatic属性。右手边的表达 必须是由以下任何一个组成的文字常量表达式:
一个简单的常量表达式,除了(),本机整数 文字,无符号本机整数文字,字节数组文字, BigInteger文字和用户定义的数字文字。
OR
对另一个文字的引用
这似乎暗示即使是字符串的组合也是不允许的。
文档说明这在F#3.1中发生了变化:
https://msdn.microsoft.com/en-us/library/dd233193.aspx
从F#3.1开始,您可以使用+号组合字符串文字。您 也可以使用按位或(|||)运算符来组合枚举标志。对于 例如,以下代码在F#3.1中是合法的:
请注意,整数添加不在该列表
上