3

リテラルを使用して空の 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"

上記のプログラムを実行しようとすると、ランダムに 2 つの異なる例外が発生します。

AccessViolationException が処理されませんでした: 保護されたメモリを読み書きしようとしました。これは多くの場合、他のメモリが破損していることを示しています。

または:

InvalidProgramException が処理されませんでした: 共通言語ランタイムが無効なプログラムを検出しました。

これは私のせいではありませんよね?私は信じられないほど愚かなのか、それとも本当に奇妙なことが起こっているのか...

編集:

どの例外がいつ表示されるかに気付きました:

  • .NET 4.5 使用時の AccessViolationException
  • .NET 4 使用時の InvalidProgramException
4

2 に答える 2

1

それをコンパイルできる理由がまったくわかりません。 System.Guidは F# リテラルではありません (こちらを参照)。ジョンが指摘したように、これはリテラル以外のもので行う必要があります。また、デフォルトSystem.Guid.Emptyの.System.Guid()Guid

于 2013-05-11T19:28:55.800 に答える