3

我正在尝试使用 Literal 匹配 Empty Guid,但我无法弄清楚这里发生了什么:

let [<Literal>] EmptyGuid = System.Guid ()

let someFunction () = System.Guid.NewGuid () |> Some

match someFunction () with
| None           -> printfn "None"
| Some EmptyGuid -> printfn "Some EmptyGuid" 
  // ^ Comment this line out and it works! 
| Some guid      -> guid.ToString "D" |> printfn "Some Guid: %s"

当我尝试运行上面的程序时,我随机得到两个不同的异常:

AccessViolationException 未处理:试图读取或写入受保护的内存。这通常表明其他内存已损坏。

或者:

InvalidProgramException 未处理:公共语言运行时检测到无效程序。

这不会是我的错吧?要么我非常愚蠢,要么发生了一些非常奇怪的事情......

编辑:

我刚刚注意到出现哪个异常:

  • 使用 .NET 4.5 时出现 AccessViolationException
  • 使用 .NET 4 时出现 InvalidProgramException
4

2 回答 2

2

从规格

· 右边的表达式必须是一个文字常量表达式,由以下任一组成:

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

——或者——</p>

· 对另一个文字的引用。

所以我认为你的 RHS 不符合规范。

尽管如此,我认为你应该得到一个更有帮助的错误信息。这应该作为错误报告给 fsbugs@microsoft.com

于 2013-05-11T22:16:55.533 回答
1

我不确定为什么它可以让你编译它。 System.Guid不是 F# 文字(参见此处)。正如约翰所指出的,您将需要使用文字以外的其他内容来执行此操作。此外,你最好使用System.Guid.Empty而不是System.Guid()如果你想要默认的Guid.

于 2013-05-11T19:28:55.800 回答