CSharp Driver Tutorial の Create a new document and use C#'s collection initializer syntax (recommended) がパッと理解出来なかったので書いてみる。
引用
BsonDocument book = new BsonDocument { { "author", "Ernest Hemingway" }, { "title", "For Whom the Bell Tolls" } };
これ、コレクション初期化子 で初期化してます。MSDN オブジェクト初期化子とコレクション初期化子 (C# プログラミング ガイド) 見ると分かるんだけど、IEnumerable 実装してて、Add メソッドを実装してると呼び出してくれる代物。
ここでは、パラメータが2つの Add メソッドを2回呼び出してる感じ。
で、BsonDocument でパラメータを2つ受け取るのは、
public BsonDocument Add(Dictionary<string, object> dictionary, IEnumerable<string> keys); public BsonDocument Add(IDictionary<string, object> dictionary, IEnumerable<string> keys); public BsonDocument Add(IDictionary dictionary, IEnumerable keys); public BsonDocument Add(string name, BsonValue value);
該当しそうなのは、最後の Add(string name, BsonValue value) なんだけど、BsonValue は string じゃないでしょ…。何でコンパイルエラーにならんのだ?
と思ったら、BsonValue は MSDN implicit (C# リファレンス) 使って、暗黙の型変換実装してるのね…。
ちなみに、コレクション初期化子は Add メソッドのパラメータが1個や2個じゃ無くても大丈夫!複数パラメータある時は、{ } で括ってカンマ区切りで渡します。MSDN 方法 : コレクション初期化子を使用してディクショナリを初期化する (C# プログラミング ガイド)*1
class HogeCollection : List<int> { public void Add(int a, string b, DateTime c) {} } new HogeCollection { { 1, "aaa", DateTime.Now }, { 2, "ccc", DateTime.Now } };
*1:てっきり Dictionary だから出来るのかと思ってた。。