如何确定对象初始值设定项是否是调用 Add 方法的初始值设定项?

How can you determine if the object initializer is the one calling the Add method?

我有一个自定义 Vector class 可以通过多种方式初始化。它有以下构造函数来创建一个给定长度的全零向量。

public Vector(int length) { ... }

或者它可以通过实现 IEnumerable 和像这样的 Add(..) 方法来使用对象初始值设定项来填充给定的向量

var v1 = new Vector{ 1, 2, 5 };

问题出在你可以写出如下代码

var v1 = new Vector(3){ 1, 2, 5 };

这看起来很无辜,但它最终创建了一个长度为 6 的向量,其中前三个值为 0,接下来的三个值为 1、2、5。理想情况下,这 return 只是一个长度为 3、值为 1、2、5 的向量。我已经完成并逐步完成了 this 的对象初始化,但似乎没有任何迹象表明正在创建该对象。看起来好像构造函数在运行,然后调用了 3 个 Add() 方法。我怎么知道它是一个调用 Add() 方法的对象初始值设定项并保护该方法不创建额外的值?

p.s。从评论部分可以明显看出,class 的 API 并不像问题中那样好。工作仍在进行中,但我很欣赏评论,因为它帮助我进一步理清了我的想法。我将按原样离开问题,以便评论有意义。

这看起来像是一个设计问题。我不会四处走动并试图告诉编译器将调用您的 Add 方法,而是将 Vector 构造函数更改为具有接收实际值或它们的数组的重载:

public Vector(double x, double y, double z)

或者

public Vector(params double[] values)

默认构造函数将保存元素的默认值,而不实际向基础数组添加任何内容。

How can I tell that it is an object intializer calling the Add() method and protect the method from creating additional values?

你不知道。该代码在功能上等同于:

var v1 = new Vector(3);
v1.Add(1);
v1.Add(2);
v1.Add(3);

就你的class而言,这两种用法是没有区别的。

您可以确保编写 that 的任何人都能按照您认为的方式运行,并且集合初始化程序代码将执行相同的操作。