通用的对象列表包含short返回false

时间:2011-07-21 17:13:40

标签: c# .net list .net-4.0

我正在研究一个项目,我必须在一个通用的对象列表中检查一些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。任何其他想法。

感谢。

3 个答案:

答案 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

不可预测的可预测