4

我收到以下运行时异常:

System.TypeLoadException 未处理
Message=Method 'Specialize' on type [...] 试图隐式覆盖具有较弱类型参数约束的方法。

这个内部函数似乎是问题所在:

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

签名是IDictionary<string,'a> -> 'a option (requires 'a : null)。约束从 传播isNull

在 ILSpy 中查找,被编译为覆盖getKey的子类型。FSharpTypeFuncSpecialize<T>()

这是一个错误吗?k我可以通过在对 的调用中装箱来解决它isNull,这消除了约束。

编辑

这是一个完整的复制品:

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"

这是 Visual Studio 2008 中的控制台应用程序,面向 .NET 4.0。奇怪的是,该代码在 FSI 中有效。

这是程序集的 PEVerify 输出:

[令牌 0x02000004] 类型加载失败。
[IL]:错误:[D:\TEST\bin\Debug\TEST.exe : Test+test@10[a]::GenerateNext] [mdToken=0x6000012][offset 0x00000031] 无法解析令牌。
2 验证 D:\TEST\bin\Debug\TEST.exe 的错误

4

1 回答 1

2

将其发送给 fsbugs 并收到已修复的回复。

于 2012-06-07T20:58:26.333 回答