未分類

C# ボクシングの仕組みを考える

準備

(なし)

デザイン

1. フォーム (Form1) にボタン (button1) を配置します。
2. フォーム (Form1) にリストボックス (listBox1) を配置します。

サンプルコード (C#)

// 名前空間の追加
// (なし)

// コード
private void button1_Click(object sender, EventArgs e)
{
  int v1 = 10;
  listBox1.Items.Add(v1.ToString());
  listBox1.Items.Add(v1.GetType().FullName);
  
  object obj = v1;
  listBox1.Items.Add(obj.ToString());
  listBox1.Items.Add(obj.GetType().FullName);
  
  int v2 = (int)obj;
  listBox1.Items.Add(v2.ToString());
  listBox1.Items.Add(v2.GetType().FullName);
  
  //double v3 = (double)obj;
  //listBox1.Items.Add(v3.ToString());
  //listBox1.Items.Add(v3.GetType().FullName);
}

解説

button1 をクリックすると、値型の変数 v1 の値を参照型の変数 obj に代入します。一見したところ、明示的な変換指示はありませんが、代入時にボクシングといわれる処理が実行されています。次に変数 obj の値を変数 v2 に代入しています。この時にはアンボクシングされますが、この処理には明示的なキャストが必要です。最後に変数 obj の値を double 型の変数 v3 に代入しています。しかし、これは実行時にエラーとなります。

このようにボクシングしたときの型でアンボクシングする必要があります。ただし、VB.NET には、CType によるキャスト方法が存在します。こちらの方法ではエラーは発生しません。

結果

動作確認環境

Visual Studio 2015 Professional (C# 6.0)

-未分類