C# 为什么我不能将一个双对象强制转换为一个字节?

C# 为什么我不能将一个双对象强制转换为一个字节?,c#,casting,c#-2.0,type-conversion,C#,Casting,C# 2.0,Type Conversion,提出这个问题的环境是复杂的,但我已经把我的问题缩小到了本质上。我有一个byte值,它被放入double变量中。然后存储在对象变量中。当我有权访问这个对象变量时,我想把它转换回一个字节。下面是我的问题的简短代码示例: byte originalValue = 23; double valueAsDouble = originalValue; // These work without issue byte valueByte = (byte)valueAsDouble; int valueInt

提出这个问题的环境是复杂的,但我已经把我的问题缩小到了本质上。我有一个
byte
值,它被放入
double
变量中。然后存储在
对象
变量中。当我有权访问这个对象变量时,我想把它转换回一个字节。下面是我的问题的简短代码示例:

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;
我想我的问题有两部分。为什么这是不允许的?除非我弄错了,
对象
只是
双精度
的一个包装器,所以我不应该对它进行同样的强制转换吗


我的第二个问题是,当我想将这样一个值转换为
字节
int
(或者我可以从
双精度
转换的其他数据类型)时,是否有一些通用的工作可以使用,但我想到了一些。在将
对象强制转换为所需类型之前,使用哪个方法将
对象强制转换为
双精度
,或者使用我不知道的其他解决方案?

仅仅因为它不是字节。是双人房。提取double,然后像前面一样将其转换为byte:

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

我认为正确的解决方法应该是使用
Convert.ToByte(valueObject)
直接从type对象中以字节形式检索值。它执行正确的强制转换,并在一个步骤中返回一个普通字节

关于为什么它不能直接强制转换,我不是很确定,但我想这与存储在
对象
变量中时要装箱的值对象有关,那么它必须在之前解除装箱,并且解除装箱需要与最初的类型相同,或者是兼容的类型。Byte与double不兼容(因为它的范围更广),所以只能取消对double的装箱(因为该值实际上是double),然后将该double强制转换为字节。
Convert
类似乎在内部完成了所有这些工作


拆箱参考如下:

我在我的问题中提到这是一个解决方法。在你的回答中,你说我不能强制转换它,因为“它是一个双精度的”,然后说一个双精度可以强制转换为一个字节。或者你是说这是首选的解决方案,如果是,为什么?