F# [<Literal>] 导致程序无效



我正在尝试使用Literal匹配空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
  • InvalidProgramException使用。net 4

从规格

·右边的表达式必须是字面常量

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

或者

·对另一个文字的引用。

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

尽管如此,我认为您应该得到一个更有用的错误消息。这应该作为bug报告到fsbugs@microsoft.com

我不知道为什么它让你编译。System.Guid不是f#文字(见这里)。正如John所指出的,您将需要使用文字以外的其他内容来完成此操作。此外,如果您希望使用默认的Guid,则最好使用System.Guid.Empty而不是System.Guid()

相关内容

  • 没有找到相关文章

最新更新