以下のようなコードがある。
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なので、まったくもって意味不明の限りである。