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

F#[<;Literal>;]导致程序无效,f#,guid,literals,F#,Guid,Literals,我正在尝试使用文字匹配空Guid,但我不知道这里发生了什么: let [<Literal>] EmptyGuid = System.Guid () let someFunction () = System.Guid.NewGuid () |> Some match someFunction () with | None -> printfn "None" | Some EmptyGuid -> printfn "Some EmptyGuid"

我正在尝试使用文字匹配空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"
let[]EmptyGuid=System.Guid()
让someFunction()=System.Guid.NewGuid()|>一些
将someFunction()与
|无->打印fn“无”
|Some EmptyGuid->printfn“Some EmptyGuid”
//^将这行注释掉,它就可以工作了!
|某些guid->guid.ToString“D”|>printfn“某些guid:%s”
当我尝试运行上面的程序时,我会随机得到两个不同的异常:

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

或:

InvalidProgrameException未处理: 公共语言运行库检测到无效程序

这不会是我的错吧?要么我非常愚蠢,要么真的有什么奇怪的事情发生

编辑:

我刚刚注意到出现以下异常:

  • 使用.NET 4.5时出现AccessViolationException异常
  • 使用.NET 4时出现InvalidProgrameException

    • 我不知道为什么它能让你编译它
      System.Guid
      不是F#literal(请参阅)。正如John所指出的,您需要使用文字以外的其他内容来完成此操作。此外,如果希望从规范中获得默认的
      Guid
      ,则最好使用
      System.Guid.Empty
      而不是
      System.Guid()

      ·右侧表达式必须是文字常量 表达式,该表达式由以下任一项组成:

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

      -或-

      ·对另一个文字的引用

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


      无论如何,我认为你应该得到一个更有用的错误信息。这应该作为一个bug报告给fsbugs@microsoft.com

      第一行本身足以使我的fsi崩溃。我认为它也符合规范。你需要在警卫做你想做的事情时使用它,这就是我最终要做的。但我不明白为什么会发生这种情况。我使用Guid(),因为编译器抱怨Guid.Empty不是有效的文本表达式;)哦,谢谢你的链接,我一直认为文字是C#const的等价物。我想每个结构都可以是文字。谢谢。这是有道理的。我会发一封电子邮件,它真的不应该编译。