13430112 journal Ryo.Fの日記: [bool]$DBNull 3 日記 by Ryo.F 2017年10月13日 0時47分 PS C:\> [bool]$nullFalsePS C:\> [bool][DBNull]::ValueTruePS C:\> なんでやねん。
DBNull.ValueはNull参照ではないから (スコア:1)
DBNullはC#/VBにNullable値もジェネリックメソッドもがなかった時代のADOの遺物で、「そのレコードにはNull値が格納されている」ことを示すために用意された型であって、Nullではないから。
そしてDBNull.Valueは、みんながDBNullを個別にインスタンス化して使うと不経済だからコレを使ってね、というシングルトンへの参照であって、Null参照ではない。
従ってBooleanに変換すればfalseに評価される。
とは言えBooleanへの変換でfalseを返す型変換メソッドを定義していても良さそうなものだけど、
DBNull.Valueの利点はEqualsメソッドによって任意の値がDBNullであるか否かを判別できる所にある。
その中には当然Boolean型との比較もあり、その値はDB上ではNull許容1ビット整数として格納されていたものだろう。
つまりnull値とfalse値が同一視されては困るわけで、DBNullは(ADOの文脈において)falseと評価されない方が良かったのだろう。
Re:DBNull.ValueはNull参照ではないから (スコア:1)
ごめん3行目書き間違えた。
誤)従ってBooleanに変換すればfalseに評価される。
正)従ってBooleanに変換すればtrueに評価される。
Re:DBNull.ValueはNull参照ではないから (スコア:1)
Nullではないから。
まあ、そんなところだろうね。
DBNullは(ADOの文脈において)falseと評価されない方が良かったのだろう。
DBNullのインスタンスが、DBNull型だ、ってことを判断できる方法があれば良いだけじゃん、って気がするけどね。