• 締切済み

C#のキャストについて(object→byte)

いつもお世話になっております。C#初心者です。 「メソッドの引数として渡された値をリスト型の配列に格納する」という課題に取り組んでいますが、 変数のキャストで実行時にエラーが発生し、頭を悩ませています。 作成したコードは以下のようになっています。 public class TestClass {  private List<byte> hogeList = new List<byte>();  public void TestMethod( object hoge )  {   hogeList.Add( (byte)hoge ); ← (*)  } } 上記のメソッドをMain関数から TestClass test = new TestClass(); test.TestMethod(5); として実行すると、「hogeList」に「5」が格納される、といった動作にしたいと考えています。 しかしながら、ビルドは通るのですが、実行すると(*)の位置で止まり、 「指定されたキャストは有効ではありません。」 というメッセージが表示されます。 そこで質問なのですが、object型からbyte型にキャストする場合にはどのような記述の仕方がありますでしょうか? ご教授よろしくお願いいたします。

みんなの回答

回答No.1

一回intに戻してみた http://ideone.com/oFEu5

関連するQ&A

  • Cの関数内ローカルstatic変数

    と同様の機能をJavaで実現したいのですが class Testclass { testmethod() { //////////////////////// //ここだけにしかコードを書けない //////////////////////// } } という条件で Testclass testclass=new Testclass(); が最初に生成された後他メソッド内で testclass.testmethod(); が実行されるたびに 1カウントアップする変数countを作成することはできるでしょうか? 上のように1つのメソッド内だけしかコーディングできません Cならば static int count=0; count++; を記述すれば片付くのですが Javaの場合はメソッド外に記述しない限りできないのでしょうか?

    • ベストアンサー
    • Java
  • C#の動的キャスト

    いつもお世話になっています。 C#の動的キャストに関する質問です。 C#のメソッドにobjectの引数を渡して動的にキャストする場合 void Hoge(object obj) { Type t = Type.GetType(obj); objの型 obj2 = (objの型)Convert.ChangeType(obj, t); //(1) ................................. } のようにされています。 しかし多様性をもつobjcetを引数にする多くの場合は「objの型」は不定です。 逆に言えば「objの型」がわかっている場合はわざわざobjectを引数にする必要はないわけです。 そこで質問ですが、何とかType t から「objの型」を取得して(1)記法による動的キャストを行う方法はないでしょうか? GetMethod, GetPropertyでメソッド,プロパティを取得し、Invoke, GetValue, SetValueすることは可能ですが、できればドット記法(.)が使える (1) のような動的キャストを行いたいと考えています。 よろしくお願いします。

  • Object型→String型へのキャストについて

    Object型からString型へのキャストについて質問させていただきます。 public void doPost(HttpServletRequest req, HtteServletResponse res) throws IOException,ServletException{ Httpsession ses = req.getSession(); ses.setAtribute("id",test) というコーディングで値を格納して、その後、その値をとりだす場合、 String test = (String) ses.getAttribute("id"); と、Object型からString型へキャストが必要と参考書には書かれているんですが、 この場合、型変換のルール(変換先のクラス型が変換元のクラス型のスーパークラスであること) にのっとってないと思うのです。 String型からObject型へのキャストだと納得いくのですが。。。 Object型からString型へキャストって問題ないものなんですか? どなたか宜しくご教示お願い致します。

    • ベストアンサー
    • Java
  • method#invoke のラッパ

    下記のようなリフレクション(動的なメソッド呼び出し)の汎用的なラッパ関数を作成しています。 class Wrapper { public static void main(String[] args) { Hoge hoge = new Hoge(); // (1) Wrapper.call(hoge, "testMethod", new Human()); // (2) これはNoSuchMethodException例外発生 Wrapper.call(hoge, "testMethod", new Japanese()); // (3) これもNoSuchMethodException Wrapper.call(hoge, "testMethod", (Human) new Japanese()); } public static Object call(Object obj, String method_name, Object ...args) { try { // 引数のクラス配列を取得 Class[] class_ary = new Class[args.length]; for (int i=0; i<args.length; i++) class_ary[i] = args[i].getClass(); Class c = obj.getClass(); // メソッドインスタンスを取得 Method method = c.getMethod(method_name, class_ary); // 実行 return method.invoke(obj, args); }catch (Exception e) { e.printStackTrace(); return null; } } } class Hoge { public void testMethod(Human h) { System.out.println(h.getClass()); } } class Human { } class Japanese extends Human { } 一見うまくうごくようにみえたのですが (2)のようにすると例外が発生することが最近わかりました。 親クラスにキャストした(3)でも同様です。 理由は // 引数のクラス配列を取得 Class[] class_ary = new Class[args.length];  for (int i=0; i<args.length; i++)   class_ary[i] = args[i].getClass(); のgetClass()の部分がキャストしようがしまいが Japaneseのクラスインスタンスを返すからだというのはわかっているのですが、他の方法が思いつきません。 多態性を備えたラッパ関数を作成することは無理でしょうか? 何か解決策があればアドバイスをお願いします。

    • ベストアンサー
    • Java
  • C# でメソッドに送られてきたObject引数の中身を、

    C# でメソッドに送られてきたObject引数の中身を、 デバッグをせずにtextに羅列したいのですが、 可能でしょうか? 本当なら該当のクラスでCastしたら、 クラスの中身をひとつひとつ確認できるのですが、 castせずに(どんな文字列でもいいので)Textに出力することは可能でしょうか?

  • C#のビルド方法について質問です。

    IDEをつかわず、コマンドプロンプト上でC#のソースをビルドする時の方法について質問です。 まず以下のようなコードがあるとします。 まずC:\の直下に以下のソースを作成しました。 =================================================== using System; using System.IO; using System.Windows.Forms; namespace Add.TestClass{ public class LibraryClass{ public LibraryClass(){ MessageBox.Show("クラスライブラリコンストラクタの実行"); } } } =================================================== 上記クラスをdllファイルとしてビルドします。 csc /t:library /out:Add.TestClass library.class  と上記のようにビルドしました。するとAdd.TestClass.dllというファイルが確かにできあがりました。 次にこれを実際に実行するためのファイルをつくりました。 それが以下になります。 同じくC:\直下に以下のようなソースを作成します。 =================================================== using System; using System.IO; using System.Windows.Forms; using Add.TestClass; public class MainClass{ public static void Main(String [] args){ LibraryClass obj = new LibraryClass(); } } =================================================== このファイルをビルドします。 csc /r:Add.TestClass.dll main.cs としてビルドし、その後 mainというファイルを実行しました。 するとキチンとMessageBoxで MessageBox.Show("クラスライブラリコンストラクタの実行");が実行されました。 ここまでは問題ないのですが、この場合 main.exeファイルとAdd.TestClass.dllというファイルが 同じ階層に存在するような状態になっているのですが、これを main.exeファイルのある階層にdllというディレクトリを作成し そのdllの中にAdd.TestClass.dllというファイルをおいた階層状況でmain.exeファイルを実行したいのです。 そのためにまず、 csc /r:”C:\dll\Add.TestClass.dll" main.cs 上記のようなビルドオプションでビルドしてみたのですが、ビルドはとおりましたが -------------------------------------------------------------------------------------------------------------------- ハンドルされていない例外: System.IO.FileNotFoundException: ファイルまたはアセン ブリ 'Add.TestClass, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'、ま たはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりませ ん。 場所 MainClass.Main(String[] args) -------------------------------------------------------------------------------------------------------------------- というエラーがでました。 このdllファイルを特定の任意のディレクトリ内において、main.exeを実行してうまく動くようにするためには どのようなビルドオプションをつけたらいいのでしょうか? よろしくご教授お願いいたしま。

  • byte配列の途中から2個ずつintに移すには?

    byte配列の途中から2個ずつintに移すには? Byte[] recvData={02:03:04:05:06:01:00:02:00:FF:FF:05} int nCount; =3;//データn個ください。 List<int> ValueList = new List<int>();//格納用 for (int i = 0; i < nCount; i++) {   //[0]~[4]までヘッダ+サブヘッダ。データは[5]から2byteずつ ValueList.Add(recvData[5 + i * 2] | (recvData[6 + i * 2] << 3)); }; という感じで、溜まったbyte配列の受信データから 0001、0002、65535とデータ部分を2byteずつ取り出したいのですが もうちょっとC#なら簡潔な書き方ってあるのでしょうか?

  • ArrayList::getメソッドは何で不便に作られている?

    ArrayList::getメソッドはObject型を返却しますよね。 そのため、たとえば、  ArrayList list = new ArrayList();  Integer aaa = new Integer();  list.add(aaa);  Integer aaa2 = (Integer)list.get(0); のように、Integerでリストに追加したものを取り出すのに わざわざIntegerでキャストしなければなりません。 なんで、こんな不便な仕様になっているのでしょうか?

    • ベストアンサー
    • Java
  • [C#]Arraylistに追加した構造体の内容の変更

    struct Hoge {     public string name;     public string address; } ArrayList list = new ArrayList(); Hoge test = new Hoge(); test.name = "あいうえお"; test.address = "123"; list.Add(test); test.name = "かきくけこ"; test.address = "456"; list.Add(test); //ここから //list[0].name = "さしすせそ"; のように追加するコードを書きたいです //ここに for (int i = 0; i < List.Count; i++) {     MessageBox.Show((Hoge)List[i]).name.ToString()); } これで、 list[0]のnameには"あいうえお" list[1]のnameには"かきくけこ" が、代入されていますが list[0]のnameをArrayListに追加したあとに変更したいのです。 このままだと、「あいうえお」「かきくけこ」と表示されますが、 「さしすせそ」を途中でlist[0]の代入して、 「さしすせそ」「かきくけこ」と表示したいのです。

  • C#でのオブジェクトのコピーについて

    visual studio 2008 express edition C#3.5 を使用しています。 参照渡しではなく値渡し(コピー元が影響されない)でオブジェクトをコピーしたいと思い、 次のようなかんじで深いコピーを行ったのですが、 tc1.cc1.i(リストを使用しない方)変更されなかったのですが tc1.cc2[0].i(リストを使用した方)は変更されてしまいます・・・ どこが原因で、リストを使用する場合はどのように記述すれば良いのでしょうか? public class TestClass { public int n; public ChildClass1 cc1 = new ChildClass1(); public List<ChildClass2> cc2 = new List<ChildClass2>(); public object DeepCopy() { TestClass tc = (TestClass)Clone(); tc.cc1 = (ChildClass1)cc1.Clone(); for (int i = 0; i < cc2.Count; i++) { tc.cc2[i] = (ChildClass2)cc2[i].Clone(); } return tc; } private object Clone() { return MemberwiseClone(); } } public class ChildClass1 : ICloneable { public int i; public object Clone() { return MemberwiseClone(); } } public class ChildClass2 : ICloneable { public int i; public object Clone() { return MemberwiseClone(); } } TestClass tc1 = new TestClass(); tc1.cc1.i = 1; ChildClass2 cc2 = new ChildClass2(); cc2.i = 1; tc1.cc2.Add(cc2); TestClass tc2 = (TestClass)tc1.DeepCopy(); tc2.cc1.i = 2; tc2.cc2[0].i = 2; System.Windows.Forms.MessageBox.Show("cc1.i = " + tc1.cc1.i + " cc2[0].i = " + tc1.cc2[0].i);// cc1.i = 1 cc2[0].i = 2←変更されてしまう