隐式对话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,为什么不能工作呢?

请注意,为了保持简单,我没有发布完整的类。如果我使用新方法,这确实有效。

隐式对话vs新对话

问题不在您在这里展示的代码中。

问题是,如果你想使用自定义类的实例作为字典中的键,你需要适当地重载EqualsGetHashCode

正如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];