内容
配列に格納されているdouble型のデータをint型へキャストすると失敗する原因が分かりませんでした。
普通のdouble型の値はint型にキャスト変換できたり、
Convert.ToInt32()では問題なくint型に変換できました。
コード
C#
1int value = 0; 2double test = 2.0; 3object[] tests = new object[] {0, 1, 2.0}; 4value = (int)test; 5value = Convert.ToInt32(tests[2]); 6value = (int)tests[2]; // 型 'System.InvalidCastException' のハンドルされていない例外が test.exe で発生しました 7 // 指定されたキャストは有効ではありません。
IndexOutOfRange が出ているので、後ろから二行目も成功するわけがありません。
記載したエラー内容が間違っていました。すみません。
System.invalidCastExceptionに修正しました。
そんな例外はありません。
うろ覚えの情報を書くのではなく、実際に回答者の手元で再現する最小のコードを作ってみてください。
初学者によくある間違いとして想像できるのは:
double[] values = new double[304];
int value = (int)values[304];
一番最後の行、
> value = (int)values[304] // (int)values[304]は型'System.invalidCastException'の例外をスローしました (型変換失敗)
の行末尾にセミコロンが無いので、実はコンパイルエラーのまま古いソースで実行していたり。
質問者さん、テキトーに書いてないで、そのままコピペすれば問題を再現できる必要最低限のサンプルを貼りましょ言う。でないと話が通じないと思いますよ。
ものすごく「作られた問題」っぽいけど、試験のカンニングかな?
元々のコードが複雑だったのでシンプルにした方がいいかなと思っていました。
エラーが再現できる内容に修正してからサンプルを貼るべきでした。
申し訳ありません。
そのままコピペすれば問題を再現できる必要最低限のサンプルで良いと言ったのですが、聞いてますか?
記載しているコードを修正しました。
当初提示されていたコードとまったく意味が異なるものになっていますがこれが正しい(問題が再現する)コードですか?
はい。最初に提示していたコードと同じ問題が再現されること確認しました。
意味が異なる、と言うか当初のコードで一般的に(読んだ者が)想定するものとは異なることが明らかになった、と言ったところでしょうか。であれば仕方無い。
もとの質問でも
// values.GetType().ToString() == "System.Object[]"
って書いてあったので
分かりづらくはありましたが
最初からObjectの配列に入ったdoubleの要素をintにキャストしようとして例外が発生しているって話だったような
はい。Objectの配列に入ったdoubleの要素をintにキャストしようとして例外が発生しておりました。
コード内にセミコロンが抜けていたり、記載したコードに誤字等があったり分かりにくい記載で申し訳ありませんでした。
@ozwk さん
> // values.GetType().ToString() == "System.Object[]"
> って書いてあったので
確かにそうですね。見落としていました。フォローをいただき、どうもありがとうございます。
回答2件
あなたの回答
tips
プレビュー