DOBON.NET DOBON.NETプログラミング掲示板過去ログ

object型のキャストについて

環境/言語:[C#, Windows XP, Oracle9i]
分類:[.NET]

はじめまして。

C#でobject型をint型に変換すると、以下のエラーになります。
「指定されたキャストは有効ではありません。」
object型をstring型に変換する処理は正常動作します。

以下ソースコード

conn.Open();

Oracle.DataAccess.Client.OracleCommand odpcmdSel = new OracleCommand();
object odpredSel;

odpcmdSel.Connection = conn;

odpcmdSel.CommandText = cmdDisplayName;
odpredSel = odpcmdSel.ExecuteScalar();
m_displayName = ((string)odpredSel).Trim(); ←ここはOK

odpcmdSel.CommandText = cmdUserID;
odpredSel = odpcmdSel.ExecuteScalar();
m_userID = (int)odpredSel; ←ここでエラー

odpcmdSel.Dispose();

以上、宜しくお願いします。
2005/03/06(Sun) 09:11:41 編集(投稿者)

こんにちは、じゃんぬねっと です。

■No9607に返信(koooさんの記事)
> C#でobject型をint型に変換すると、以下のエラーになります。
> 「指定されたキャストは有効ではありません。」
> object型をstring型に変換する処理は正常動作します。

それは、object型 に格納されているモノが、
string では有効だけど、int では (数値型では) 有効でないからです。
以下を試してみてください。

  object objInt = 12345;
  object objStr = "STRING";
  int  int1;
  int  int2;

  try {
    int1 = (int)objInt; // OK!
    int2 = (int)objStr; // NG!
  } catch (Exception ex) {
    MessageBox.Show(ex.ToString());
  }
こんな感じでしょうか。

object objStr = "12345";
int  int1;
int1 = Convert.ToInt32(objStr) ;
> C#でobject型をint型に変換すると、以下のエラーになります。
> 「指定されたキャストは有効ではありません。」
> object型をstring型に変換する処理は正常動作します。

えムナウさんと同じことですが、objectの中にCLR型以外の型
(IConvertibleを実装していない型)が入っていた
場合Convertはエラーを投げてきます。従って、万全を期すならば

object o = hoge;
int i;
if(o is IConvertible)
{
   i = ((IConvertible)o).ToInt32(null);
}
のようにしたほうがいいのかもしれません。
koooです。

皆様の返信を参考にすることで、
解決する事ができました。

また、分からない事があったらよろしくお願いします。

どうもありがとうございました。

DOBON.NET | プログラミング道 | プログラミング掲示板