11

以下のコードは、最後の割り当てで失敗します。

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場合、このエラーの原因は何ですか?

4

5 に答える 5

25

これは非常によくある質問です。説明については、 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>

于 2012-04-30T16:36:56.180 に答える
17

開箱には正確なタイプが必要です-代わりにこれを行うことができます:

double y = (double)(int)b;
于 2012-04-30T16:36:45.060 に答える
2

暗黙のキャストはコンパイル時の操作です。bの型にはできませんobject

于 2012-04-30T16:46:20.637 に答える
0

aは ですがintbオブジェクトへの参照ですint- これはボックス化された int と呼ばれるものです。これらは 2 つの異なるものであるため、動作も異なります。

于 2012-04-30T16:38:48.113 に答える