看看这些家伙:
VisualStudio 中我的即时窗口的输出。
"15" == x.Documents.Attributes["key"]
false
x.Documents.Attributes["key"]
"15"
为什么当两个值相等时为假????
属性是Dictionary<string, object>
……没什么特别的。
我不明白。我认为 == 即使使用 object.ToString() 也知道如何处理字符串。
我想念什么?帮我解决这个问题。
看看这些家伙:
VisualStudio 中我的即时窗口的输出。
"15" == x.Documents.Attributes["key"]
false
x.Documents.Attributes["key"]
"15"
为什么当两个值相等时为假????
属性是Dictionary<string, object>
……没什么特别的。
我不明白。我认为 == 即使使用 object.ToString() 也知道如何处理字符串。
我想念什么?帮我解决这个问题。
因为该值仅称为object
,==
这里实际上是一个引用相等检查。要执行string
测试,编译器需要知道它是string
:
"15" == (string)x.Documents.Attributes["key"]
这是因为运算符 like==
是重载的,而不是重写的 - 它们不是多态的。
如果值不都是字符串,那么这更安全:
"15" == x.Documents.Attributes["key"] as string
因为如果返回的值实际上不是 aas
将返回(并且对这里的值很好)。null
string
==
null
答案很简单:你得到一个类型的键,Object
你将它与一个string
. 尝试调用ToString()
你得到的键,你会得到正确的比较,从而得到一个true
.
如果您正在比较对象(如您的情况),通常最好使用 Equals 方法而不是 == 运算符,因为它是虚拟的,因此将调用正确的实现。
对于您的代码:
x.Documents.Attributes["key"].Equals("15");
应该返回真
编辑:这仅在您的类型实际上是字符串时才成立。如果您想检查对象的字符串表示是否与其他字符串表示匹配,您应该按照其他人所说的那样做:
x.Documents.Attributes["key"].ToString() == "15";
也就是说,我不会推荐它。如果对象没有 a ToString()
,您将检查它们是否是相同的类型(Object
s 的实现ToString()
)。在这一点上,这取决于你想要做什么......
第一行:x.Documents.Attributes["key"]
第二行:x.DocumentFile.Attributes["key"]
看到不同?
您应该使用 equals 并将类型转换为字符串
"15".equals(
(string) x.Documents.Attributes["key"])
false
x.Documents.Attributes["key"]
"15"
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