IntPtr和UIntPtr文字

时间:2014-10-30 07:02:37

标签: f# f#-3.1

我尝试为HWND_BROADCAST ((HWND)0xffff)创建一个文字,它被编组为IntPtr

let [<Literal>] HWND_BROADCAST = 0xFFFFn

Visual Studio告诉我:错误FS0267:这不是有效的常量表达式或自定义属性值。

非常好。然后我检查了documentation on F# Literals on MSDN,我注意到unativeintUIntPtr)在列表中。我可以用它代替IntPtr。但是:

let [<Literal>] HWND_BROADCAST = 0xFFFFun

相同的错误消息。

所以我有两个问题:

  1. 为什么不支持nativeint文字?背后有原因吗?
  2. 为什么unativeint文字工作没有,即使MSDN说它应该?
  3. 在Visual Studio 2013上使用F#3.1.2(F#Interactive版本12.0.30815.0)。


    我注意到bigint也在列表中,但也不起作用。所以我猜测它只是MSDN错了。

1 个答案:

答案 0 :(得分:2)

这是两个不同的东西 - 列表包含所有支持的文字字符串,但不是所有字符串都可以用Literal属性标记。我认为表格下方评论的措辞有点不幸。

BigInt和IntPtr是结构体,这可能就是为什么它们不能被声明为consts(我相信这就是属性归结为)。似乎在C#中就是这种情况,比较here

我认为这一点适用于IntPtr,但BigInt可能会被编译器专门处理。虽然这种黑客的有用性可能有限。