关于为什么会这样做的任何想法
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返回类型。让我神秘的是,如果所有结构都有不同的字段值,这就有效。
答案 0 :(得分:6)
原因是因为值类型的相等性基于其值 - 对于struct,它在所有字段中是相等的。
引用类型相等性基于引用本身,因此起作用。将结构值更改为全部不同也有效。
如果你只想要一个东西列表,只需使用List<Point>
,我认为这将接受重复。
更新:您的集合类似乎检测到重复的条目,并且您正在尝试添加重复项。如果你想添加重复项,我会说你不能使用这个类。
答案 1 :(得分:3)
您是否尝试使用过List?我认为它应该有用!
希望有所帮助!
答案 2 :(得分:1)
我不熟悉你正在使用的这个集合类,但显然它不允许有多个项目。与SET集合一样。所以我猜你正在使用的Collection相当于:
Dictionary<String, Point>
但是因为你没有钥匙,所以更像是
HashSet<Point>
就像您的收藏类一样,HashSet要求所有键为唯一。就像Kieren提到的那样,List会更适合你。列表允许多个条目相同。
确实如果Point是一个类,它会允许重复,因为Objec1!= Object2即使它们的值相同也是如此。
答案 3 :(得分:0)
我真的不确定这一点,但我有一种感觉,因为编译器会生成一个强大的Collections项,不需要box / unbox值类型,所以对显式值类型本身进行了键检查,产生重复键异常?
这真的只是在黑暗中拍摄的!
答案 4 :(得分:0)
什么是Collection
课程。它不是.NET Framework库类。看看这个类的文档或来源,它可以解释这个问题。