我正在尝试使用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未处理: Common Language Runtime检测到无效程序。
这不可能是我的错,可以吗?无论是我非常愚蠢,还是有一些非常奇怪的事情......
编辑:
我刚注意到出现了哪个异常:
答案 0 :(得分:2)
来自规范
·右侧表达式必须是文字常量 表达式由以下两者组成:
·一个简单的常量表达式,除了(), 本机整数文字,无符号本机整数文字,字节数组 文字,BigInteger文字和用户定义的数字文字。
-OR -
·对另一个文字的引用。
所以我认为您的RHS不符合规范。
Neverthelss,我认为您应该收到更有帮助的错误消息。这应该报告为fsbugs@microsoft.com的错误
答案 1 :(得分:1)
我不知道为什么它可以让你编译它。 System.Guid
不是F#文字(请参阅here)。正如约翰所指出的那样,你需要用文字以外的东西来做这件事。另外,如果您想要默认的System.Guid.Empty
,最好使用System.Guid()
而不是Guid
。