FSharpTypeFunc.Specialize causing TypeLoadException

4

I'm getting the following run-time exception:

System.TypeLoadException was unhandled
Message=Method 'Specialize' on type [...] tried to implicitly override a method with weaker type parameter constraints.

This inner function appears to be the problem:

let getKey (r: IDictionary<_,_>) = 
  match r.TryGetValue(keyCol.Name) with
  | true, k when not (isNull k) -> Some k
  | _ -> None

The signature is IDictionary<string,'a> -> 'a option (requires 'a : null). The constraint is propagated from isNull.

Looking in ILSpy, getKey is compiled to a sub-type of FSharpTypeFunc that overrides Specialize<T>().

Is this a bug? I can work around it by boxing k in the call to isNull, which removes the constraint.

EDIT

Here's a full repro:

open System.Collections.Generic

let isNull = function null -> true | _ -> false
type KeyCol = { Name : string }

let test() =
  seq {
    let keyCol = { Name = "" }
    let getKey (r: IDictionary<_,_>) = 
      match r.TryGetValue(keyCol.Name) with
      | true, k when not (isNull k) -> Some k
      | _ -> None
    getKey (dict ["", box 1])
  }

test() |> Seq.length |> printfn "%d"

This is a console app in Visual Studio 2008, targeting .NET 4.0. Strangely, the code works in FSI.

Here's PEVerify output for the assembly:

[token 0x02000004] Type load failed.
[IL]: Error: [D:\TEST\bin\Debug\TEST.exe : Test+test@10[a]::GenerateNext] [mdToken=0x6000012][offset 0x00000031] Unable to resolve token.
2 Error(s) Verifying D:\TEST\bin\Debug\TEST.exe

exception
f#
asked on Stack Overflow Jun 6, 2012 by Daniel • edited Dec 6, 2013 by Kara

1 Answer

2

Sent it to fsbugs and received a reply that it's been fixed.

answered on Stack Overflow Jun 7, 2012 by Daniel

User contributions licensed under CC BY-SA 3.0