[英]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.