可能是重复问题:
类型扩展错误
我想在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
然而,编译器抱怨我的声明与字典的声明不同。当我省略等式约束时,它不会产生特定的错误。但是它会警告它缺失了。非常感谢任何提示,最好是除了“降低警告级别”之外的提示 :-)
编辑
非常感谢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
Dictionary<_,_>
类型中,而另一个问题的答案解释了为什么需要调用一个接受IEqualityCompararer<_>
的构造函数重载来避免类型约束。 - kvbthis.Comparer
,因为您正在创建静态成员,但您可以改用EqualityComparer<_>.Default
。 - kvb