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