F#[<;Literal>;]导致程序无效
我正在尝试使用文字匹配空Guid,但我不知道这里发生了什么: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"
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的等价物。我想每个结构都可以是文字。谢谢。这是有道理的。我会发一封电子邮件,它真的不应该编译。