Nikon the Third
Nikon the Third

Reputation: 2831

F# [<Literal>] causes Invalid Program

I'm trying to match the Empty Guid using a Literal, and I can't figure out what's going on here:

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"

When I try to run the program above, I get two different Exceptions somewhat randomly:

AccessViolationException was unhandled: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

Or:

InvalidProgramException was unhandled: Common Language Runtime detected an invalid program.

This can't be my fault, can it? Either I'm incredibly stupid or there is something really weird going on...

EDIT:

I just noticed when which exception appears:

Upvotes: 3

Views: 779

Answers (2)

N_A
N_A

Reputation: 19897

I'm not sure why that it lets you compile that at all. System.Guid is not an F# literal (see here). As John noted, you will need to do this with something other than a literal. Also, you might better off using System.Guid.Empty rather than System.Guid() if you want the default Guid.

Upvotes: 1

John Palmer
John Palmer

Reputation: 25516

From the spec

· The right-hand side expression must be a literal constant expression that is made up of either:

· A simple constant expression, with the exception of (), native integer literals, unsigned native integer literals, byte array literals, BigInteger literals, and user-defined numeric literals.

—OR—

· A reference to another literal.

So I would think that your RHS does not follow the spec.

Neverthelss, I think you should be getting a more helpful error message. This should be reported as a bug to [email protected]

Upvotes: 2

Related Questions