我尝试为HWND_BROADCAST ((HWND)0xffff)
创建一个文字,它被编组为IntPtr
。
let [<Literal>] HWND_BROADCAST = 0xFFFFn
Visual Studio告诉我:错误FS0267:这不是有效的常量表达式或自定义属性值。
非常好。然后我检查了documentation on F# Literals on MSDN,我注意到unativeint
(UIntPtr
)在列表中。我可以用它代替IntPtr
。但是:
let [<Literal>] HWND_BROADCAST = 0xFFFFun
相同的错误消息。
所以我有两个问题:
nativeint
文字?背后有原因吗?unativeint
文字工作没有,即使MSDN说它应该?在Visual Studio 2013上使用F#3.1.2(F#Interactive版本12.0.30815.0)。
我注意到bigint
也在列表中,但也不起作用。所以我猜测它只是MSDN错了。
答案 0 :(得分:2)
这是两个不同的东西 - 列表包含所有支持的文字字符串,但不是所有字符串都可以用Literal属性标记。我认为表格下方评论的措辞有点不幸。
BigInt和IntPtr是结构体,这可能就是为什么它们不能被声明为consts(我相信这就是属性归结为)。似乎在C#中就是这种情况,比较here。
我认为这一点适用于IntPtr,但BigInt可能会被编译器专门处理。虽然这种黑客的有用性可能有限。