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;

我猜我的问题有两个部分。为什么不允许这样做?除非我弄错了,否则object它只是一个包装器,double所以我不应该把它投射到同样的地方吗?

我的第二个问题是,当我想将这样的值转换为 a byteor int(或我通常可以从 a 转换的其他数据类型double)时,是否可以使用一些通用的工作,但我想到了一对。最好使用Convert.ChangeType(),在object将 adouble转换为所需类型之前将其转换为 a ,或者我不知道的其他解决方案?

4

2 回答 2

2

仅仅因为它不是一个字节。是双倍的。提取双精度,然后像以前一样将其转换为字节:

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

我认为正确的解决方法应该是Convert.ToByte(valueObject)直接从类型对象中检索值作为字节。它确实执行正确的转换并在一步中返回一个纯字节。

关于为什么它不能直接直接转换,我不太确定,但我想这与存储在object变量中时被装箱的值对象有关,那么它必须事先被拆箱,并且拆箱需要完成与最初的相同类型或兼容的类型。Byte 与 double 不兼容(因为它的范围更广),因此您只能将其拆箱为 double(因为该值实际上是 double),然后将该 double 转换为一个字节。Convert班级似乎在内部完成了所有这些工作。

拆箱参考在这里:http: //msdn.microsoft.com/library/b95fkada (v=vs.80).aspx

于 2013-07-09T16:29:52.287 回答