我有以下课程:
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,为什么这不起作用呢?
请注意,我没有发布完整的课程以保持简单。如果我使用新方法,这可以工作。
答案 0 :(得分:2)
问题不在于您在此处显示的代码中。
问题在于,如果要将自定义类的实例用作字典中的键,则需要正确地重载Equals
and 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();
}
}
答案 1 :(得分:1)
也许您需要在类ChArray中覆盖GetHashCode()和Equals()?这些用于比较键。
答案 2 :(得分:1)
只是增加了另一个答案。我的意思是,问题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];