隐式转换与新的转换

时间:2014-03-26 07:02:53

标签: c# implicit-cast

我有以下课程:

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,为什么这不起作用呢?

请注意,我没有发布完整的课程以保持简单。如果我使用新方法,这可以工作。

3 个答案:

答案 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];