我正在尝试在 F# 中创建结构相等的字典,并且希望传递多个字典构造函数重载。
在 C# 中,这看起来像
class StructuralDictionary<Key, Value> : Dictionary<Key, Value> where Key : IEquatable<Key>
{
public StructuralDictionary() : base() { }
public StructuralDictionary(IDictionary<Key, Value> dict) : base(dict) { }
public StructuralDictionary(IEqualityComparer<Key> keyComparer) : base(keyComparer) { }
}
F# 文档有 section demonstrating this usecase ,但我无法编译它
type StructuralDictionary<'key, 'value when 'key:equality> =
new (dictionary:IDictionary<'key,'value>) = { inherit Dictionary<'key,'value>(dictionary) }
new () = { inherit Dictionary<'key, 'value> () }
最佳答案
如果要使用隐式构造函数语法,所有其他构造函数都必须调用隐式构造函数(并且最终会间接调用基类的相同构造函数)。
在您的示例中,您可以定义一个以 IDictionary
作为参数的隐式构造函数,并使用另一个构造函数中的空字典调用它:
type StructuralDictionary<'TKey, 'TValue when 'TKey:equality>
(dictionary:IDictionary<'TKey, 'TValue>) =
inherit Dictionary<'TKey, 'TValue>(dictionary)
new () = StructuralDictionary(dict [])
与仅调用不带参数的基本构造函数(您分配一个空字典)相比,这可能会产生一些小开销,但它允许您使用隐式构造函数的所有其他方便功能,因此可能是值得的。
关于inheritance - F# 添加多个调用基类构造函数的构造函数重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75900935/