我收到以下运行时异常:
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
的子类型。FSharpTypeFunc
Specialize<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 的错误