我工作的一个项目,我必须检查类短对象的泛型列表的一些值。 奇怪的是我注意到,它总是返回false即使在对象的泛型列表该值。 我提供一小块代码可复制的场景在我的项目。
List<object> objectList = new List<object>();
objectList.Add(1);
objectList.Add(2);
objectList.Add(3);
if (objectList.Contains(1))
{
short i = 1;
if (objectList.Contains(i))
{
}
else if (objectList.Contains(i.ToString()))
{
}
else
{
//Entering this else this loop only
}
}
我的假设是因为在尺寸这些类型可以返回false的差异。 没有其他的想法。
谢谢。
objectList.Add(1);
是相同的
int i = 1;
objectList.Add(i);
所以
int y = 1;
objectList.Contains(y); // true
short z = 1;
objectList.Contains(z); // false
你加入盒装Integer对象的列表,然后看是否数量的盒装短或字符串的版本是在列表中,这两者会因为他们是不同类型的是假的。
尝试铸造你的短为int的第一次考验。 你为什么选择不使用通用<int>
并跳过装箱/拆箱?
总之是一个对象类型,因此在默认情况下它会只等于它自己的实例。 这种平等已覆写的框架内这样的:
public override bool Equals(object obj)
{
if (!(obj is short))
return false;
else
return (int) this == (int) (short) obj;
}
没怎么你和我本来期望它:)
它更是意想不到的比你想象。 看看下面的案例:
int i = 1;
short s = 1;
System.Console.WriteLine(i==s ? "Yes" : "No"); // Yes
System.Console.WriteLine(i.CompareTo(s)==0 ? "Yes" : "No"); // Yes
System.Console.WriteLine(s.CompareTo(i) == 0 ? "Yes" : "No"); // ERROR !
System.Console.WriteLine(s.Equals(i) ? "Yes" : "No"); // No
System.Console.WriteLine(i.Equals(s) ? "Yes" : "No"); // Yes
恩可预测,并不是非常一致