-5

看看这些家伙:

VisualStudio 中我的即时窗口的输出。

"15" == x.Documents.Attributes["key"]
false
x.Documents.Attributes["key"]
"15"

为什么当两个值相等时为假????

属性是Dictionary<string, object>……没什么特别的。

我不明白。我认为 == 即使使用 object.ToString() 也知道如何处理字符串。

我想念什么?帮我解决这个问题。

4

6 回答 6

4

因为该值仅称为object==这里实际上是一个引用相等检查。要执行string测试,编译器需要知道它是string

"15" == (string)x.Documents.Attributes["key"]

这是因为运算符 like==重载的,而不是重写的 - 它们不是多态的。

如果值不都是字符串,那么这更安全:

"15" == x.Documents.Attributes["key"] as string

因为如果返回的值实际上不是 aas将返回(并且对这里的值很好)。nullstring==null

于 2013-11-11T12:50:04.287 回答
2

答案很简单:你得到一个类型的键,Object你将它与一个string. 尝试调用ToString()你得到的键,你会得到正确的比较,从而得到一个true.

于 2013-11-11T12:45:55.450 回答
2

如果您正在比较对象(如您的情况),通常最好使用 Equals 方法而不是 == 运算符,因为它是虚拟的,因此将调用正确的实现。

对于您的代码:

x.Documents.Attributes["key"].Equals("15");

应该返回真

编辑:这仅在您的类型实际上是字符串时才成立。如果您想检查对象的字符串表示是否与其他字符串表示匹配,您应该按照其他人所说的那样做:

x.Documents.Attributes["key"].ToString() == "15";

也就是说,我不会推荐它。如果对象没有 a ToString(),您将检查它们是否是相同的类型(Objects 的实现ToString())。在这一点上,这取决于你想要做什么......

于 2013-11-11T12:46:09.927 回答
0

第一行:x.Documents.Attributes["key"]

第二行:x.DocumentFile.Attributes["key"]

看到不同?

于 2013-11-11T12:47:22.933 回答
0

您应该使用 equals 并将类型转换为字符串

"15".equals( 
    (string) x.Documents.Attributes["key"])
    false
    x.Documents.Attributes["key"]
    "15"
于 2013-11-11T13:02:44.407 回答
0

Marc Gravell 的回答是绝对正确的,只是补充一下,这里有一个例子:

var dic = new Dictionary<string, object>
{
    {
        "key",
        string.Format("{0}", "hello") // this to avoid interning string
    }
};
Console.WriteLine(dic["key"] == "hello"); // false
Console.WriteLine((string)dic["key"] == "hello"); // true
于 2013-11-11T13:04:31.420 回答