对象的泛型列表包含短返回false(generic list of objects contains

2019-09-30 03:28发布

我工作的一个项目,我必须检查类短对象的泛型列表的一些值。 奇怪的是我注意到,它总是返回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的差异。 没有其他的想法。

谢谢。

Answer 1:

objectList.Add(1);

是相同的

int i = 1;
objectList.Add(i);

所以

int y = 1;
objectList.Contains(y); // true

short z = 1;
objectList.Contains(z); // false


Answer 2:

你加入盒装Integer对象的列表,然后看是否数量的盒装短或字符串的版本是在列表中,这两者会因为他们是不同类型的是假的。

尝试铸造你的短为int的第一次考验。 你为什么选择不使用通用<int>并跳过装箱/拆箱?



Answer 3:

总之是一个对象类型,因此在默认情况下它会只等于它自己的实例。 这种平等已覆写的框架内这样的:

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

恩可预测,并不是非常一致



文章来源: generic list of objects contains short returning false