F#Literal/constant可以用字符串组成,但不能用int组成?

Ove*_*urg 4 f#

为什么这样可以:

let [<Literal>] hi = "hi"
let [<Literal>] bye = "bye"
let [<Literal>] shortMeeting = hi + bye
Run Code Online (Sandbox Code Playgroud)

......但这不是?

let [<Literal>] me = 1
let [<Literal>] you = 1
let [<Literal>] we = me + you
Run Code Online (Sandbox Code Playgroud)

第三行给出错误:

This is not a valid constant expression
Run Code Online (Sandbox Code Playgroud)

那是怎么回事?

Joh*_*mer 8

所以spec/docs有点不清楚,但提供了提示.

从规范(对于F#3.0):

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

它可能没有标记为可变或内联.它可能也没有ThreadStaticor ContextStatic属性.右侧表达式必须是由以下任一组成的文字常量表达式:

一个简单的常量表达式,除了(),本机整数文字,无符号本机整数文字,字节数组文字,BigInteger文字和用户定义的数字文字.

要么

对另一个文字的引用

这似乎暗示即使是字符串的组合也是不允许的.

文档说明这在F#3.1中发生了变化:

https://msdn.microsoft.com/en-us/library/dd233193.aspx

从F#3.1开始,您可以使用+号组合字符串文字.您还可以使用按位或(|||)运算符来组合枚举标志.例如,以下代码在F#3.1中是合法的:

请注意,整数添加不在该列表中