我有类似以下内容作为通用字典的键。
class IMyClass<T> : IEquatable<IMyClass> where T : struct
{
//etc
}
class MyClass<T> : IMyClass<T> where T : struct
{
public bool Equals(IRatingKey<T> other)
{
//etc
}
}
据我了解EqualityComparer<T>.Default
,它应该看到我已经实现IEquatable<T>
并因此动态创建了一个 EqualityComparer。
Dictionary<TKey, TValue>
需要一个相等实现来确定键是否相等。如果 comparer 为 null,则此构造函数使用默认的泛型相等比较器EqualityComparer<T>.Default
. 如果 typeTKey
实现了System.IEquatable<T>
泛型接口,则默认相等比较器使用该实现。
但是从我看到的使用字典索引器的情况来看Dictionary<T>[]
,它仍然依赖于覆盖 GetHashcode,例如public override int GetHashCode()
我可以看到有建议覆盖很多以保持一致性,但我试图更多地理解它。是因为 IEquatable 应该直接位于 MyClass 而不是 IMyClass 中吗?但我更喜欢在 IMyClass 上使用它,因此实现者需要成为字典键。
我正在尝试使用 IEqualityComparer,但据我所知,我不需要它。