Frame<int, int>[] test = new Frame<int, int>[3] {{2,5},{3,6},{4,7}};
配列初期化子は、変数またはフィールド初期化子でのみ使用できます。代わりに新しい式を使用してみてください。宣言のペアの初期化、それを行うには?
どうすれば可能ですか?
Frame<int, int>[] test = new Frame<int, int>[3] {{2,5},{3,6},{4,7}};
配列初期化子は、変数またはフィールド初期化子でのみ使用できます。代わりに新しい式を使用してみてください。宣言のペアの初期化、それを行うには?
どうすれば可能ですか?
問題はそれだけでリテラル{2,3}
がFrame<int, int>
を表していないということです。
Frame<int, int>[] test = new Frame<int, int>[]
{
new Frame<int, int>(2, 5),
new Frame<int, int>(3, 6),
new Frame<int, int>(4, 7)
};
これを回避する方法があります:それだけ、それはこのように、インスタンス化を伴うために持っている意味初期化子の一部として使用されています。次の2つの特性を持つ型を定義すると、必要な構文を得ることができます。
IEnumerable
を実装する必要があります。Add
を持っている必要があります。(それはちょうどそれを実装するように定義する必要がありますつまりGetEnumerator
方法は何もする必要はありません。実際、それもそれを実装本当にする必要はありません)方法。ここで、Add
要件は、初期化構文がどのように機能するかを定義します。 FrameCollection
クラスは2つのint
パラメータを受け取りAdd
メソッドを定義し
// Skeleton code for illustration only.
class Frame<T1, T2>
{
public Frame(T1 x, T2 y)
{
X = x;
Y = y;
}
public T1 X { get; private set; }
public T2 Y { get; private set; }
}
// IEnumerable (non-)implementation for initializer syntax.
class FrameCollection : IEnumerable
{
List<Frame<int, int>> _frames;
public FrameCollection()
{
_frames = new List<Frame<int, int>>();
}
// Add method to enable initialization syntax using { x, y }.
public void Add(int x, int y)
{
_frames.Add(new Frame<int, int>(x, y));
}
public Frame<int, int>[] ToArray()
{
return _frames.ToArray();
}
// This method doesn't technically need to do anything.
IEnumerator IEnumerable.GetEnumerator()
{
throw new InvalidOperationException();
}
}
ので、我々は今、このようなコードを書くことができます:
をので、ここでの例では、Frame<int, int>[]
配列の初期化のために純粋に設計されたFrameCollection
クラスを使用して、ですvar frames = new FrameCollection
{
{ 2, 5 },
{ 3, 6 },
{ 4, 7 }
};
foreach (Frame<int, int> frame in frames.ToArray())
{
Console.WriteLine("({0}, {1})", frame.X, frame.Y);
}
出力:
(2, 5) (3, 6) (4, 7)
ありがとうございました! –
このようなものではないはずですか?ここ
Frame<int, int>[] test = new Frame<int, int>[3] {
new Frame<int, int>(2,5),
new Frame<int, int>(3,6),
new Frame<int, int>(4,7)
};
フレームの構造は何ですか? –