c# - 集合行为中的奇怪 C# 结构

标签 c# struct collections

关于为什么会这样的任何想法

    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}
           };

(注意相同的第一个和最后一个元素) 给出错误

已添加具有相同 key 的项目。

如果您将最后一个元素更改为 Y=20.1 或任何使其不同的元素,那么它就可以工作。 您也可以随意添加元素并获得相同的结果。

问题显然是由于 Point 是一个值类型,因为如果你定义和使用一个 point 类,它就会消失,而且我知道在其他集合类型中使用结构存在问题,但这与值之间的差异有关和 ref 返回类型。令我感到困惑的是,如果所有结构都具有不同的字段值,这会起作用。

最佳答案

原因是因为值类型的相等性基于它的值 - 对于结构它在所有字段上都是相等的。

引用类型相等性基于引用本身,因此有效。将结构值更改为完全不同也有效。

如果你只是想要一个列表,只需使用 List<Point> ,我认为这将接受重复项。

更新:您的集合类似乎正在检测重复项,而您正在尝试添加重复项。如果你想添加重复项,我会说你不能使用这个类。

关于c# - 集合行为中的奇怪 C# 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3235802/

相关文章:

c# - 将数据保存在内存中

c# - .NET 反射 - 从反射集合中获取第一项而不强制转换为特定集合

c# - 如何将 IsChecked 绑定(bind)到 ViewModel 子类

c# - Unity处理来自Socket的数据流

c# - 为 WP7 和 WP8 创建图表

c - 指向结构内部的结构指针的空指针而不取消引用它

go - 在其他程序包中初始化并调用struct时,是否可能仅返回一个字段?

c# - 无法创建列表对象数组

可绑定(bind)到 DDL 的 C# 全局变量/常量,但名称为 "Nice"

c++ - 使用结构时,表达式必须具有(指针到)函数类型