首先,我使用这里GetHashCode
描述的算法。现在,想象以下(人为的)示例:
class Foo
{
public Foo(int intValue, double doubleValue)
{
this.IntValue = intValue;
this.DoubleValue = doubleValue;
}
public int IntValue { get; private set; }
public double DoubleValue { get; private set; }
public override int GetHashCode()
{
unchecked
{
int hash = 17;
hash = hash * 23 + IntValue.GetHashCode();
hash = hash * 23 + DoubleValue.GetHashCode();
return hash;
}
}
}
class DerivedFoo : Foo
{
public DerivedFoo(int intValue, double doubleValue)
: base(intValue, doubleValue)
{
}
}
如果我的 aFoo
和 aDerivedFoo
每个属性的值都相同,那么它们将具有相同的哈希码。这意味着我可以在 Linq 中拥有HashSet<Foo>
或使用该Distinct
方法,并且这两个实例将被视为相同。
我可能只是误解了使用,GetHashCode
但我希望这两个实例具有不同的哈希码。这是一个无效的期望还是应该GetHashCode
在计算中使用该类型?(或者DerivedClass
也应该覆盖GetHashCode
)?
PS我意识到有很多关于这个主题的问题,但我还没有发现直接回答这个问题的问题。