以下のコードは、最後の割り当てで失敗します。
static void Main(string[] args)
{
int a = 5;
object b = 5;
System.Diagnostics.Debug.Assert( a is int && b is int );
double x = (double)a;
double y = (double)b;
}
a と b の両方が であるint
場合、このエラーの原因は何ですか?
これは非常によくある質問です。説明については、 http://blogs.msdn.com/b/ericlippert/archive/2009/03/19/representation-and-identity.aspxを参照してください。
スニペット:
C#キャスト演算子についてかなりの数の質問があります。私が得る最も頻繁な質問は次のとおりです。
short sss = 123; object ooo = sss; // Box the short. int iii = (int) sss; // Perfectly legal. int jjj = (int) (short) ooo; // Perfectly legal int kkk = (int) ooo; // Invalid cast exception?! Why?
なんで?ボックス化されたものは、ボックス化
T
解除することしかできないためT
です。(*)箱から出したら、通常どおりキャストできる値なので、ダブルキャストは問題なく機能します。(*)または
Nullable<T>
。
開箱には正確なタイプが必要です-代わりにこれを行うことができます:
double y = (double)(int)b;
暗黙のキャストはコンパイル時の操作です。b
の型にはできませんobject
。
a
は ですがint
、b
オブジェクトへの参照ですint
- これはボックス化された int と呼ばれるものです。これらは 2 つの異なるものであるため、動作も異なります。