C# 具有字典的类的等于和哈希代码<;t、 k>;作为属性

C# 具有字典的类的等于和哈希代码<;t、 k>;作为属性,c#,dictionary,C#,Dictionary,正如您所知,C#中的字典类不会覆盖Equals和hashCode。我面临这样一个场景:我有一个具有属性Dictionary的类。我已经使用标准VS代码段为这个类生成了哈希代码和equals。因此,当对此类的实例调用.Equals()时,对于dictionary属性,将调用object的.Equals(),我总是得到一个错误的结果 附件是一个用于澄清的示例虚拟类 public class TestClass : IEquatable<TestClass> { private s

正如您所知,C#中的
字典
类不会覆盖
Equals
hashCode
。我面临这样一个场景:我有一个具有属性
Dictionary
的类。我已经使用标准VS代码段为这个类生成了哈希代码和equals。因此,当对此类的实例调用
.Equals()
时,对于dictionary属性,将调用object的
.Equals()
,我总是得到一个错误的结果

附件是一个用于澄清的示例虚拟类

public class TestClass : IEquatable<TestClass>
{
    private string _dummyName;
    private Dictionary<string, string> _dummyDict;

    public bool Equals(TestClass other)
    {
        if (ReferenceEquals(null, other)) return false;
        if (ReferenceEquals(this, other)) return true;
        return Equals(other._dummyName, _dummyName) && Equals(other._dummyDict, _dummyDict);
    }

    public override bool Equals(object obj)
    {
        if (ReferenceEquals(null, obj)) return false;
        if (ReferenceEquals(this, obj)) return true;
        if (obj.GetType() != typeof (TestClass)) return false;
        return Equals((TestClass) obj);
    }

    public override int GetHashCode()
    {
        unchecked
        {
            return ((_dummyName != null ? _dummyName.GetHashCode() : 0)*397) ^ (_dummyDict != null ? _dummyDict.GetHashCode() : 0);
        }
    }
}
public类TestClass:IEquatable
{
私有字符串_dummyName;
私人词典;
公共布尔等于(TestClass其他)
{
if(ReferenceEquals(null,other))返回false;
if(ReferenceEquals(this,other))返回true;
返回等于(其他.dummyName,dummyName)和等于(其他.dummyDict,dummyDict);
}
公共覆盖布尔等于(对象对象对象)
{
if(ReferenceEquals(null,obj))返回false;
if(ReferenceEquals(this,obj))返回true;
if(obj.GetType()!=typeof(TestClass))返回false;
返回等于((TestClass)obj);
}
公共覆盖int GetHashCode()
{
未经检查
{
返回((\u dummyName!=null?\u dummyName.GetHashCode():0)*397)^(\u dummyDict!=null?\u dummyDict.GetHashCode():0);
}
}
}
您正在呼叫

return Equals(other._dummyName, _dummyName) && Equals(other._dummyDict, _dummyDict);
这将调用您的
等于
实现。对于所有类型不为
TestClass
的对象,只要它们的引用不相等,该实现就会返回
false


第一次调用hasr字符串作为参数,第二次调用字典。这两个qould都将返回false。

可能出现什么错误?Dictionary不会覆盖Equals,因此对于Dictionary属性,将调用object类中的Equals,并给出错误的结果。