[英]Strange C# struct in collection behaviour
關於為什么這樣的任何想法
public Collection<Point> data = new Collection<Point>(){
new Point{X=10,Y=20},
new Point{X=20,Y=30},
new Point{X=40,Y=20},
new Point{X=10,Y=20}
};
(注意相同的第一個和最后一個元素)給出錯誤
已添加具有相同鍵的項目。
如果您將最后一個元素更改為Y = 20.1或任何使其不同的元素,則它可以正常工作。 您也可以隨意添加元素並獲得相同的結果。
問題顯然是由於Point是一個值類型,因為如果你定義並使用一個點類它會消失,我知道在其他集合類型中使用結構有問題,但這與值和ref返回的區別有關類型。 令我神秘的是,如果所有結構具有不同的字段值,則此方法有效。
原因是因為值類型的相等性基於其值 - 對於struct,它在所有字段中是相等的。
引用類型相等性基於引用本身,因此起作用。 將結構值更改為全部不同也有效。
如果你只想要一個東西列表,只需使用List<Point>
,我認為這將接受重復。
更新:看起來您的集合類正在檢測重復的條目,並且您正在嘗試添加重復項。 如果你想添加重復項,我會說你不能使用這個類。
您是否嘗試過使用List? 我認為它應該工作!
希望有所幫助!
我不熟悉你正在使用的這個集合類,但顯然它不允許有多個項目。 與SET集合一樣。 所以我猜你正在使用的Collection相當於:
Dictionary<String, Point>
但既然你沒有鑰匙,那就更像了
HashSet<Point>
就像你的集合類一樣,HashSet要求所有鍵都是唯一的 。 就像Kieren提到的那樣,List會更適合你。 列表允許多個條目相同。
實際上,如果Point是一個類,它將允許重復,因為Objec1!= Object2即使它們的值相同也是如此。
我真的不確定這一點,但我有一種感覺,因為編譯器生成一個強大的Collections項,不需要box / unbox值類型,鍵檢查是在顯式值類型本身上完成的,這會產生重復的關鍵異常?
那真的只是在黑暗中拍攝!
什么是Collection
類。 它不是.NET Framework庫類。 看看這個類的文檔或來源,它可以解釋這個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.