ボックス値のキャスト
.NET(C#)でSQLiteを使ってコーディングしていたら、以下のコードでSystem.InvalidCastExceptionが。
return (int)cmd.ExecuteScalar();
これはレコード件数を取得するためのSQLを発行して、その結果を受け取るためのコード。
INTEGER型の値を取得するだけなので、戻り値はSystem.Int64のはずだし、値は0。
普通に考えたら、System.Int32にキャストはできると思うんだけど...。
何故キャストできないのか、しばらく悩む。
しばらく考えて、気付いた。
ExecuteScalar()の戻り値はSystem.Object。という事は、ボックス化されたSystem.Int64が返される事になる。
つまり、単純にSystem.Int64をSystem.Int32にキャストしてる訳じゃなくて、System.Int32へのアンボックスになってしまっていた。
そりゃ無理な訳ですね。
だから、System.Int64にアンボックスしてからSystem.Int32にキャストすれば良い訳だ。
どうにも、寝ぼけすぎて基本中の基本すら忘れてしまったらしい。
return (int)((long)cmd.ExecuteScalar());
キャストが連続するのは気持ち悪いが、仕方ないか。