ボックス値のキャスト

.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());

キャストが連続するのは気持ち悪いが、仕方ないか。