以下のコードは、最後の割り当てで失敗します。
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 つの異なるものであるため、動作も異なります。