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