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