MongoDB.Bson.BsonDocument のコレクション初期化子でハマった〜

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 だから出来るのかと思ってた。。