隐式对话vs新对话
本文关键字:对话 vs 新对话 | 更新日期: 2023-09-27 17:53:18
我有以下类:
public class ChArray {
private string m_str;
public ChArray(string str) {
m_str = (str.Length > m_len ? str.Substring(0, m_len) : str);
}
public static implicit operator ChArray(string str) {
return new ChArray(str);
}
}
我使用这个类作为字典键。为什么下列语句不相等?使用new,一切工作正常,但使用字符串,我得到一个没有找到的键。
ChArray LINE_LEN = new ChArray("lineLen");
ChArray LINE_LEN = "lineLen"
隐式操作返回一个新的ChArray,为什么不能工作呢?
请注意,为了保持简单,我没有发布完整的类。如果我使用新方法,这确实有效。
问题不在您在这里展示的代码中。
问题是,如果你想使用自定义类的实例作为字典中的键,你需要适当地重载Equals
和GetHashCode
。
正如LordTakkera所说:
[类的]默认比较器将检查它们是否实际上是相同的对象(当然它们不是)。
注意:
Object.Equals("foo", "foo"); // returns true
,
Object.Equals(new ChArray("foo"), new ChArray("foo")); // returns false
适当地重写这两个函数将提供正确的结果。
这个应该工作:
public class ChArray {
// (as you have it)
public override bool Equals(System.Object obj)
{
// If parameter cannot be cast to ChArray return false:
ChArray p = obj as ChArray;
if ((object)p == null)
{
return false;
}
// Return true if the fields match:
return m_str == p.m_str;
}
public bool Equals(ChArrayp)
{
// Return true if the fields match:
return m_str == p.m_str;
}
public override int GetHashCode()
{
return m_str.GetHashCode();
}
}
也许你需要重写GetHashCode()和Equals()在你的类ChArray ?它们用于比较键。
只是添加到另一个答案。我的意思是,Using new, everything works just fine, but using a string, I get a key not found.
这个问题仍然没有答案。
当你使用
var key = new ChArray("lineLen");
dictionary.Add(key, someValue);
var value = dictionary[key];
key
仍然是相同的对象,因为您没有覆盖Equals
方法,object.Equals
使用的是引用比较。
当你使用
ChArray key = "lineLen";
dictionary.Add(key, someValue);
var value = dictionary[key];
它仍然必须工作。
但是如果你使用
你会得到KeyNotFoundException
ChArray key = "lineLen";
dictionary.Add(key, someValue);
var value = dictionary["lineLen"];
或
ChArray key = "lineLen";
dictionary.Add(key, someValue);
ChArray key1 = "lineLen";
var value = dictionary[key1];