こんな DataTable があったとします。(仮に tbl とします)
下記のコードを実行します。
すると結果は下のようになります。
| COL1 | COL2 | COL3 | COL4 |
| 1-1 | 1-2 | | 20 |
| 2-1 | 2-2 | | 20 |
| 3-1 | 3-2 | 10 | 20 |
DefaultValue の設定のタイミングと DataTable への登録のタイミングで結果が変わります。
また、この時下記の処理を実行してみましょう。
すると、InvalidCastException が発生します。
DataType が指定されていない場合、int や bool は文字列として格納されます。
つまり "20" という文字列が値として入っていたから例外が発生するわけですね。
としておけば、int 型として格納されますので、上記でキャスト例外は発生しません。
直感的なコーディングのためにも、DataType プロパティは指定しましょう。
次に下記の処理を行ってみましょう。
すると結果は下のようになります。
| COL1 | COL2 | COL3 | COL4 |
| 1-1 | 1-2 | | 20 |
| 2-1 | 2-2 | | 20 |
| 3-1 | 3-2 | 10 | 20 |
| 4-1 | 4-2 | 10 | |
Rows.Add メソッドにオブジェクト配列で値を渡す場合、null と DBNull.Value では結果が異なります。
AllowDBNull が false の場合、どちらもはじかれます。
いまさらですが、特にキャストでちょっとはまったのでメモ
参照型ならどーなんだ、列挙体はどーなんだ?とかまだまだありそうですが、それはおいおい調べてみよう。