2011-01-03 11 views
2
Frame<int, int>[] test = new Frame<int, int>[3] {{2,5},{3,6},{4,7}}; 

配列初期化子は、変数またはフィールド初期化子でのみ使用できます。代わりに新しい式を使用してみてください。宣言のペアの初期化、それを行うには?

どうすれば可能ですか?

+1

フレームの構造は何ですか? –

答えて

6

問題はそれだけでリテラル{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つの特性を持つ型を定義すると、必要な構文を得ることができます。

  1. 型はIEnumerableを実装する必要があります。
  2. タイプは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) 
+0

ありがとうございました! –

3

このようなものではないはずですか?ここ

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) 
}; 
関連する問題