憂邦烈士連合会@ソロプレイ

IT、PG、アニメ、エンタメ、政治、歴史、時事、社会、カメラ、etc

C#/VBにおいてDataTable.Rows.Add関数が例外となる【'System.IConvertible' にキャストできません。】

 以下のようなコードがある。

            var table = new DataTable();
            var col = table.Columns.Add("A", typeof(Double));
            table.Columns.Add("B", typeof(Double));
            table.PrimaryKey = {col};

            var x = new {"0", "0"};
            table.Rows.Add((from n in x select Convert.ToDouble(n)).ToArray());

 "型 'System.Double' のオブジェクトを型 'System.IConvertible' にキャストできません。列 A に <System.Double> を格納できませんでした。 必要な型は Double です。"

 毎度のことながら、よくわからん。
 で、調べてみる。

            var r = table.NewRow();
            r.ItemArray = new {0d, 0d};

 とすると、

 '<double>' は参照型ではないため、型 '<double>' の値を '<object>' に変換できません。

 というような、コンパイルエラーが出る。

 最初のコードが失敗する理由は、理由としては参照型であることが条件らしく、 ItemArray には object と string は可能だ。
 おとなしくstring[]を使うべきなのだろう。

 さて、話はここからだ。ここからはイミフだ。
 C#はこれまでの方法でいいのだが、VBでは意味不明な事態が起こるのだ。

            table.Rows.Add({0#, 0#})
            table.Rows.Add(New Double() {0#, 0#})

 これ、1行目はセーフで、2行目はアウトなのだ。
 ちなみに、 New Double() {0#, 0#}.SequenceEqual({0#, 0#}) の結果はTrueなので、まったくもって意味不明の限りである。