Mas*_*oud 4 c# dictionary equals
我有一个名为Class1的类我覆盖它的Equals函数现在我有一个Dictionary的实例我添加了一个名为OBJ1的Class1实例.我有另一个名为OBJ2的Class1实例.对于OBJ1.Equals(OBJ2),代码返回true.但我在字典中找不到OBJ2.
这是伪代码
Class1 OBJ1 = new Class1(x, y, z);
Class1 OBJ2 = new Class1(a, b, c);
Dictionary<Class1, int> dic1 = new Dictionary<Class1, int>();
dic1.Add(OBJ1, 3);
OBJ1.Equals(OBJ2) -------------> return true
Dictionary.ContainsKey(OBJ2) --------------> return false
Run Code Online (Sandbox Code Playgroud)
为什么会这样?任何帮助都会受到高度欢迎
Ani*_*Ani 13
2种可能性:
GetHashCode没有被正确覆盖.您可能想看看为什么在C#中覆盖Equals方法时重写GetHashCode很重要?OBJ1在以影响其哈希码的方式添加到字典中之后,它已经发生了变异.在这种情况下,它所放置的铲斗将不再正确 - ContainsKey最终将在另一个铲斗中寻找它.只要对象在Dictionary中用作键,就不能以任何影响其哈希值的方式进行更改.
Jon*_*eet 12
你有可能没有GetHashCode以符合的方式覆盖Equals.
合同GetHashCode要求if OBJ1.Equals(OBJ2)返回true,则OBJ1.GetHashCode()必须返回相同的值OBJ2.GetHashCode().
IIRC,如果覆盖Equals而没有覆盖,则会出现编译器错误(或至少是警告)GetHashCode().
另一种可能性是你实际上没有overridden Equals,但是通过添加新的签名来重载它,例如
public bool Equals(Class1 other)
Run Code Online (Sandbox Code Playgroud)
一般来说,要提供"自然"价值平等比较,您应该:
IEquatable<T>| 归档时间: |
|
| 查看次数: |
4973 次 |
| 最近记录: |