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

时间:2013-05-11 08:51:34

标签: f# guid literals

我正在尝试使用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检测到无效程序。

这不可能是我的错,可以吗?无论是我非常愚蠢,还是有一些非常奇怪的事情......

编辑:

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

  • 使用.NET 4.5时的AccessViolationException
  • 使用.NET 4时的InvalidProgramException

2 个答案:

答案 0 :(得分:2)

来自规范

  

·右侧表达式必须是文字常量   表达式由以下两者组成:

     

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

     

-OR -

     

·对另一个文字的引用。

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

Neverthelss,我认为您应该收到更有帮助的错误消息。这应该报告为fsbugs@microsoft.com的错误

答案 1 :(得分:1)

我不知道为什么它可以让你编译它。 System.Guid不是F#文字(请参阅here)。正如约翰所指出的那样,你需要用文字以外的东西来做这件事。另外,如果您想要默认的System.Guid.Empty,最好使用System.Guid()而不是Guid