我正在研究一个项目,我必须在一个通用的对象列表中检查一些short类型的值。奇怪的是,我注意到即使在通用的对象列表中存在该值,它也始终返回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。任何其他想法。
感谢。
答案 0 :(得分:3)
objectList.Add(1);
与
相同int i = 1;
objectList.Add(i);
所以
int y = 1;
objectList.Contains(y); // true
short z = 1;
objectList.Contains(z); // false
答案 1 :(得分:1)
您正在将列入框的Integer对象添加到列表中,然后查看列表中的数字的盒装短版本或字符串版本是否都是错误的,因为它们是不同的类型。
尝试在第一次测试中将短片转换为int。为什么你选择不使用通用<int>
并跳过装箱/拆箱?
答案 2 :(得分:0)
short是对象类型,因此默认情况下它只等于它自己的实例。这种相等性已在框架内被覆盖:
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
不可预测的可预测