合并params和IList <t>构造函数

时间:2016-08-29 12:45:13

标签: c# .net visual-studio constructor

有没有办法将这两个构造函数合并为一个?基本上他们接受Point3D类型的相同数组。

public Curve(int degree, params Point3D[] points) {} 

public Curve(int degree, IList<Point3D> points) {}

感谢。

3 个答案:

答案 0 :(得分:4)

如果你想拥有2个不同的构造函数,你可以:

public Curve(int degree, params Point3D[] points) : this(degree, (IList<Point3D>)points) { }
public Curve(int degree, IList<Point3D> points) { }

或者,如果你只想要一个构造函数让我们说第一个,那么你可以像这样初始化:

new Curve(0,new List<Point3D>().ToArray());

通过让一个构造函数调用另一个构建函数,您不需要复制所有逻辑,并且仍然启用两种格式的初始化。

虽然Array实现IList<T>但由于编译错误导致(IList<Point3D)无法删除compiler ...... cannot call itself

enter image description here

答案 1 :(得分:1)

如果它看起来像这样:

public Curve(int degree, Point3D[] points) 
{
    ...
}

public Curve(int degree, IList<Point3D> points)
{
    ...
}

比你可以使用:(只要你只需要对其包含的Point3D s集合进行迭代)

public Curve(int degree, IEnumerable<Point3D> points)
{
    ...
}

但是,既然你想要一个params构造函数,那就不可能了,因为你无法像这样调用构造函数:

Curve curve = new Curve(30, p1, p2, p3);

但只有这样:

Curve curve = new Curve(30, new Point3D[] {p1, p2, p3});

可以使用以下方式重用其代码:

public Curve(int degree, params Point3D[] points)
{
    ...
}
public Curve(int degree, IList<Point3D> points) : this(degree, points.ToArray()) { }

或者相反:

public Curve(int degree, IList<Point3D> points)
{
    ...
}
public Curve(int degree, params Point3D[] points) : this(degree, points as IList<Point3D>) { }

将使用params构造函数初始化实例,方法与使用List构造函数的方式相同。

PS: 您可能要考虑将IList更改为IEnumerable,以允许该类的用户更抽象地使用它

答案 2 :(得分:0)

如果我理解正确,问题是您不能简单地执行以下操作:

public Curve(int degree, params Point3D[] points)
            : this(degree, points) //want to chain to (int, IList<Point3D>) constructor
{
}

public Curve(int degree, IList<Point3D> points)
{
}

因为您收到以下编译时错误:Error CS0516 Constructor 'Curve.Curve(int, params int[])' cannot call itself".

您可以通过简单地将引用转换为适当的类型

来解决这个问题
public Curve(int degree, params Point3D[] points)
    : this(degree, (IList<Point3D>)points)
{
}

这样可行,因为数组T[]实现了IList<T>