为什么我不能将双重对象转换为字节?

时间:2013-07-09 15:58:26

标签: c# casting c#-2.0 type-conversion

周围的情况带来了这个问题很复杂,但我把问题归结为它的本质。我有一个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的一个包装,所以我不应该把它转换成相同的吗?

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

2 个答案:

答案 0 :(得分:2)

仅仅因为它不是一个字节。这是双倍的。解压缩double,然后像以前一样将其转换为byte:

byte valueReconvertToByte = (byte)((double)valueObject);

答案 1 :(得分:1)

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

关于为什么它不能直接进行直接投射,我不是很确定,但我想这与存储在object变量中的值框对象有关,那么它必须是未装箱的以前,并且unbox需要完成与原来相同的类型或兼容的类型。字节与double不兼容(因为它具有更宽的范围),因此您只能取消装箱为double(因为该值实际上是双倍),然后将该双精度转换为一个字节。 Convert类似乎在内部完成所有这些。

取消装箱参考位于:http://msdn.microsoft.com/library/b95fkada(v=vs.80).aspx