我正在尝试使用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()
。