繁体   English   中英

收集行为中的奇怪C#结构

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM