【问题标题】:Why can't an object which holds a float value be cast to double? [duplicate]为什么不能将具有浮点值的对象强制转换为双精度值? [复制]
【发布时间】:2019-07-15 06:24:41
【问题描述】:

如果将浮点数分配给双精度型,它会接受它,但如果浮点型首先分配给一个对象然后强制转换为双精度型,则会给出 InvalidCastException。

有人可以澄清一下吗?

float f = 12.4f;
double d = f;//this is ok

//but if f is assigned to object
object o = f;
double d1 = (double)o;//doesn't work, (System.InvalidCastException) 

double d2 = (float)o;//this works

【问题讨论】:

  • 查看下面的答案here
  • 谢谢@martijn-van-put。该链接有帮助。我理解“Boxed T 只能拆箱为 T”。

标签: c# casting


【解决方案1】:

隐式数值转换

float f = 12.4f;
double d = f;//this is ok

拆箱转换

object o = f;
double d1 = (double)o;//doesn't work, (System.InvalidCastException)

对 non_nullable_value_type 的拆箱操作包括首先检查对象实例是否是给定 non_nullable_value_type 的装箱值,然后将值复制出实例。

换句话说,它检查o 是否从double 中被装箱,显然不是在这种情况下。


更多关于转化的信息here

【讨论】:

  • 是的,现在我明白了,在拆箱时,它首先检查盒装类型。谢谢:)
  • Nitpick:从floatdouble 的隐式转换不会导致数据丢失,因为double 具有更高的精度——每个float 都有一个double 的精确表示。当它被格式化为以 10 为基数显示时,该数字可能看起来不同,但这与数据丢失不同。
  • @JeroenMostert 实际上你是对的。只有显式转换可能会导致数据丢失... tnx
  • 停止编辑您的帖子以将它们放到首页。
猜你喜欢
  • 2020-05-28
  • 2020-09-26
  • 1970-01-01
  • 2015-08-30
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多