周围的情况带来了这个问题很复杂,但我把问题归结为它的本质。我有一个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
或int
(或者我可以正常投射的其他一些数据类型)时,我可以使用一些通用的工作来自double
),但我想到了一对。哪个最好,使用Convert.ChangeType(),在转换为所需类型之前将object
强制转换为double
,或者其他一些我不知道的解决方案?
答案 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