1

これを引き起こした状況は複雑ですが、私は問題を本質にまで切り詰めました。変数byteに入れられる値があります。doubleその後、変数に格納されobjectます。このオブジェクト変数にアクセスできたら、バイトにキャストし直します。これが私の問題の短いコード例です:

byte originalValue = 23;
double valueAsDouble = originalValue;

// These work without issue
byte valueByte = (byte)valueAsDouble;
int valueInt = (int)valueAsDouble;
object valueObject = valueAsDouble;

// Both of these lines throw and InvalidCastException
int valueReconvertToInt = (int)valueObject;
byte valueReconvertToByte = (byte)valueObject;

私の質問には、私が推測する2つの部分があります。これが許可されないのはなぜですか?私が間違っていない限り、これobjectは単にラッパーであるdoubleため、同じようにキャストできるはずではありませんか?

byte私の2番目の質問は、そのような値をor int(または通常は a からキャストできる他のデータ型) にキャストしたいときに使用できる一般的な回避策があるということですが、いくつかdouble考えました。Convert.ChangeType()を使用し、 a を目的の型にキャストobjectする前に adoubleにキャストするか、または私が認識していない他のソリューションを使用するには、どれが最適でしょうか?

4

2 に答える 2

2

Simply because it isn't a byte. It's a double. Extract the double, then cast it to byte as before:

byte valueReconvertToByte = (byte)((double)valueObject);
于 2013-07-09T16:02:48.890 に答える
1

Convert.ToByte(valueObject)適切な回避策は、型オブジェクトから直接バイトとして値を取得するために使用する必要があると思います。適切なキャストを実行し、プレーン バイトを 1 ステップで返します。

直接キャストできない理由についてはobjectよくわかりませんが、変数に格納されたときに値オブジェクトがボックス化されていることに関係していると思います。元と同じタイプ、または互換性のあるタイプに行われます。Byte は double と互換性がないため (範囲が広いため)、double にボックス化を解除して (値が実際には double であるため)、その double を byte にキャストすることしかできません。クラスはそれConvertをすべて内部的に行うようです。

アンボックス リファレンスはこちら: http://msdn.microsoft.com/library/b95fkada(v=vs.80).aspx

于 2013-07-09T16:29:52.287 に答える