2

次のコードを検討してください。

private static void Main(string[] args)
{
    short age = 123;
    object ageObject = age;
    //var intAge = (int)ageObject;//Specified cast is not valid.
    int newAge= (short)intAge;
    Console.ReadLine();
}

オブジェクトに短い値を割り当てて、再びintにキャストする必要がありますが、これを試みると、次のvar intAge = (int)ageObject;ようになります:指定されたキャストは無効です。どうしてか分かりません?

Googleで検索した後、shortにキャストしてintに割り当てる必要があることがわかりました:int newAge= (short)intAge;

short にキャストして int に代入する必要があるのはなぜですか?

コンパイラがこの動作をするのはなぜですか?

4

4 に答える 4

4

失敗は実行時エラーです。

その理由は、age値がオブジェクトにボックス化されているためです。間違ったタイプ ( int) への開封は失敗です - それはshort.

コメントアウトした行のキャストは、単なるキャストではなく、ボックス化解除操作です。

于 2013-07-19T11:06:22.090 に答える
2

使用する

Convert.ToInt32(ageObject) instead.

それが動作します

于 2013-07-19T11:09:36.607 に答える
1

short を object に変換してから int に変換しようとしている理由がわかりませんでした。

次の方法で short -> int 変換を行うことができます。

{
short age = 123;
int intAge1 = (short)age;
int intAge2 = (int)age;
int intAge3 = Int16.Parse(age.ToString());
}
于 2013-07-19T11:15:04.180 に答える
0

ボックス化された値は、まったく同じ型の変数にのみボックス化を解除できます。この制限は、ジェネリックが登場する前に .NET 1.x を実現可能にした速度の最適化に役立ちました。これを見てください。

単純な値型は IConvertible インターフェイスを実装します。Convert クラスを使用して呼び出すもの

      short age= 123;
    int ix = Convert.ToInt32(age);
于 2013-07-19T11:07:16.677 に答える