簡體   English   中英

對象的通用列表包含返回 false

[英]generic list of objects contains short returning false

我正在做一個項目,我必須在 object 的通用列表中檢查一些 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
    }
}

我的假設是因為這些類型的大小不同,它可能返回錯誤。 任何其他想法。

謝謝。

objectList.Add(1);

是相同的

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

所以

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

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

您將盒裝 Integer 對象添加到列表中,然后查看數字的盒裝短版或字符串版本是否在列表中,這兩者都將是錯誤的,因為它們是不同的類型。

嘗試在第一次測試中將你的 short 轉換為 int。 為什么您選擇不使用通用<int>並跳過裝箱/拆箱?

short 是一個 object 類型,所以默認情況下它只等於它自己的實例。 這種相等性已在框架內被覆蓋,如下所示:

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

不是很一致 en 可預測的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM