ネタ元 → オブジェクトの初期化
C# 3.0 ではコレクションの初期化が簡単になりました。
// 3.0
List<int> c = new List<int>{ 1, 2, 3 };
// 現2.0だと
List<int> c = new List<int>(new int[] { 1, 2, 3 });
C# 3.0 のスペック曰く:
「The collection object to which a collection initializer is applied must be of a type that implements System.Collections.Generic.ICollection<T> for exactly one T.」
ネタ元のコメントで青柳さん解説するに:
「collection initializer は ICollection<T>.Add(T) を順番に呼び出すだけですね。なので、対象となる型は ICollection<T> を実装していないとダメですし...」
ホントかなー?
AddできるだけでいいんならICollection<T>を実装しろっ
てのはちとオオゲサやん…てんでお試し。
collection initializer が使えるminimum-codeを書いてみました:
// Visual Studio 2008 codename "Orcas" β1 で検証
using System;
using System.Collections;
using System.Collections.Generic;
class Fake<T> : IEnumerable {
private T[] data;
private int size;
private int capacity;
public Fake(int capac) {
Console.WriteLine("Fake({0})", capacity = capac);
data = new T[capacity];
}
public void Add(T item) {
Console.WriteLine("Add({0})", item);
if ( size < capacity ) data[size++] = item;
}
IEnumerator IEnumerable.GetEnumerator()
{ for ( int i = 0; i < size; ++i )
yield return data[i]; }
}
class Program {
public static void Main() {
Fake<int> c = new Fake<int>(10){ 1, 2, 3};
foreach ( int item in c ) {
Console.Write("{0} ", item);
}
}
}
…えとね、System.Collections.IEnumerable を実装し、
Addメソッドさえあればいいみたいよ。