可能重复:
类型扩展错误
我想将 F# 中的扩展方法添加到 System.Collections.Generic.Dictionary。问题是我似乎无法正确设置类型约束。我希望像下面这样的东西会起作用:
type Dictionary<'k, 'd when 'k : equality> with
static member ofList (xs:list<'k * 'd>) : Dictionary<'k, 'd> =
let res = new Dictionary<'k, 'd> ()
for (k, d) in xs do
res.Add (k, d)
res
但是,编译器抱怨我的声明与 Dictionary 的声明不同。当我忽略等式约束时,它不会产生那个特定的错误。但随后它警告说它丢失了。非常感谢任何提示,最好是“降低警告级别”的其他提示:-)
编辑
非常感谢 KVB 提供了我想要的答案。
type Dictionary<'k, 'd> with
static member ofList (xs:list<'k * 'd>) : Dictionary<'k, 'd> =
let res = new Dictionary<'k, 'd> (EqualityComparer<'k>.Default)
for (k, d) in xs do
res.Add (k, d)
res
编辑:这是一个更好地解释我对 RJ 的回复的例子。它表明在实例化类型时类型参数是可选的,只要编译器可以推断它们。它编译时没有警告或错误。
type System.Collections.Generic.Dictionary<'k, 'd> with
static member test (dict:System.Collections.Generic.Dictionary<'k, 'd>) : bool =
dict.Values |> List.ofSeq |> List.isEmpty
let test (x:System.Collections.Generic.Dictionary<'k, 'd>) =
System.Collections.Generic.Dictionary.test x