これらの2つのコンストラクタを1つにマージする方法はありますか?基本的には、同じ配列Point3D
を受け入れます。paramsとIList <T>コンストラクタのマージ
public Curve(int degree, params Point3D[] points) {}
public Curve(int degree, IList<Point3D> points) {}
ありがとうございます。
これらの2つのコンストラクタを1つにマージする方法はありますか?基本的には、同じ配列Point3D
を受け入れます。paramsとIList <T>コンストラクタのマージ
public Curve(int degree, params Point3D[] points) {}
public Curve(int degree, IList<Point3D> points) {}
ありがとうございます。
、問題は単純に次の操作を行うことができないということです。
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".
あなたがこの問題を回避することができますが単にT[]
はを実装しているため、配列この作品appropiateタイプ
public Curve(int degree, params Point3D[] points)
: this(degree, (IList<Point3D>)points)
{
}
への参照をキャストすることにより、。
あなたはあなたができる2つの異なるコンストラクタ持つようにしたい場合:
public Curve(int degree, params Point3D[] points) : this(degree, (IList<Point3D>)points) { }
public Curve(int degree, IList<Point3D> points) { }
するか、したい場合のみ、1つのコンストラクタは、最初は、あなたがこのように初期化することができると言うことができます:1を有することにより
new Curve(0,new List<Point3D>().ToArray());
もう一方を呼び出すコンストラクターでは、すべてのロジックを複製する必要はなく、どちらの形式の初期化も有効にします。
public Curve(int degree, Point3D[] points)
{
...
}
public Curve(int degree, IList<Point3D> points)
{
...
}
すると、使用できるより:compiler ...... cannot call itself
これは逆です。コレクション全体をコピーする代わりにキャストのみが必要です。 –
@Dennis_E - corrected :) –
@CSharpie - Arrayはそれを実装しているが、それがなければ 'コンストラクタ........自身を呼び出せません 'というコンパイルエラーがあることに同意します。 –
が、それはこのように見えた場合:Array
ものの
はのエラーをコンパイルする(IList<Point3D)
原因を除去することはできませんIList<T>
1を実装します。 (あなたがコレクターだけを反復する必要がある限りその含まPoint3D
のためション)
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()) { }
または他の方法で回避を::あなたはは使用して自分のコードを再利用することができ、それはList
1を使用していますparams
コンストラクタと同じ方法を使用してインスタンスを初期化します
public Curve(int degree, IList<Point3D> points)
{
...
}
public Curve(int degree, params Point3D[] points) : this(degree, points as IList<Point3D>) { }
。
P.S:あなたは、そのクラスのユーザーは、より抽象的にそれを使用できるようにするために、とにかくIEnumerable
にIList
を変更することを検討することをお勧めします。私が正しくあなたを理解していた場合
第1の電話に第2の電話をかけますか? –
'params'機能(単一の値を使用して)をサポートしたい場合、それらをマージすることはできません。すべての 'Point3D []'は 'IList'ですが、 'IList 'のすべてが配列ではありません。したがって、 'params'コンストラクタに' IList'コンストラクタを呼び出させることができます: 'this(degree、(IList )points)' –