【ASP.NET】C# DataTable.Select()メソッドにはやはりバグがある!?

久しぶりに技術的な記事でも。
MSDNのフォーラムで非常に興味深い投稿があったので自分でも色々試してみた。

僕自身もDataTable.Select()メソッドはなんか変だなぁと違和感をずっと感じていた。
前もブログの記事にしたけど、

やっぱりDataTable.Select()メソッドには何かしらのバグがあるとしか思えない。

まず下のソースコードだが、フォーラムの投稿を僕の普段の環境Visual Studio 2005、.NET Framework 2.0という条件に書き直して実行してみた。

    DataTable dt = new DataTable();

    dt.Columns.Add("Column1", typeof(string)).AllowDBNull = false;
    dt.Columns.Add("Column2", typeof(string)).AllowDBNull = false;
    dt.Columns.Add("Column3", typeof(string)).AllowDBNull = false;

    // DataTable.Load などでは内部的に実行される
    dt.BeginLoadData();
    dt.EndLoadData();

    // (回避その1 → 削除しない)
    dt.Columns.Remove("Column1");

    // (回避その2 → テーブルを作り直す)
    //dt = dt.Copy();

    Random r = new Random();
    for (int i = 0; i < 1000; i++)
    {
        DataRow row = dt.NewRow();
        row["Column2"] = "";
        row["Column3"] = new string((char)r.Next('A', 'Z' + 1), 1);
        dt.Rows.Add(row);
    }

    // DataView による絞り込み
            DataView dv = new DataView(dt,"Column3 = 'C'",string.Empty,DataViewRowState.CurrentRows);
    int rowCount1 = dv.Count;
    // Select による絞り込み
    int rowCount2 = dt.Select("Column3 = 'C'").Length;
    // (回避その3 → 条件内で関数を使う)
    int rowCount3 = dt.Select("convert(Column3, 'System.String') = 'C'").Length;

    MessageBox.Show(
        string.Format(
            "1. DataView.RowFilter → {0}\r\n" +
            "2. DataTable.Select → {1}\r\n" +
            "3. DataTable.Select(2) → {2}",
            rowCount1, rowCount2, rowCount3));

MSDNの投稿にもあるように、DataTableからカラムを削除すると、DataViewにキャストしたときの件数、DataTable.Select()で取得した件数、DataTable.Select()メソッド内で関数を使った場合の件数それぞれが一致しなかった。
やはり、DataTable.Select()メソッドにはバグがあるように思えてしかたない。
普段、よく使うメソッドだけに、慎重に使用しないといけないと思い直した。

Microsoftさん。気づいていたら早急に対応して頂きたいものです。
それとも何か理由があるのだろうか??
また分かり次第、記事にしてみようと思う。