【问题标题】:IntPtr and UIntPtr literalsIntPtr 和 UIntPtr 文字
【发布时间】:2014-10-30 07:02:37
【问题描述】:

我尝试为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 说它应该起作用?

在 Visual Studio 2013 上使用 F# 3.1.2(F# Interactive 版本 12.0.30815.0)。


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

【问题讨论】:

    标签: f# f#-3.1


    【解决方案1】:

    这是两个不同的东西 - 列表包含所有受支持的文字字符串,但并非所有字符串都可以使用 Literal 属性进行标记。我觉得表格下方评论的措辞有点遗憾。

    BigInt 和 IntPtr 是结构,这可能就是为什么不能将它们声明为 const 的原因(我相信这就是属性归结为的原因)。在 C# 中似乎也是如此,比较 here

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

    【讨论】:

    • 我明白你的意思。但是,这仍然是非常矛盾的,因为列表显然缺少 nativeint 的文字。
    • 啊,是的,从来没有注意到。
    猜你喜欢
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 2021-11-09
    • 2017-07-26
    • 1970-01-01
    • 2017-05-18
    相关资源
    最近更新 更多