代码之家  ›  专栏  ›  技术社区  ›  Homam

为什么(int)(object)10M抛出“指定的强制转换无效”异常?

  •  36
  • Homam  · 技术社区  · 14 年前

    为什么这个显式强制转换会引发 Specified cast is not valid. 例外?

    decimal d = 10m;
    object o = d;
    int x = (int)o;
    

    但这是可行的:

    int x = (int)(decimal)o;
    
    4 回复  |  直到 6 年前
        1
  •  66
  •   silkfire thezar    6 年前

    装箱值只能与完全相同类型的变量解除装箱。这个看似奇怪的限制是一个非常重要的速度优化,使得.NET 1.x在泛型可用之前是可行的。你可以在 this answer .

    您不希望跳过多个强制转换环,简单的值类型实现IConvertible接口。通过使用convert类调用:

            object o = 12m;
            int ix = Convert.ToInt32(o);
    
        2
  •  19
  •   BoltClock    14 年前

    当你这样做的时候,你就隐式地把十进制装箱了。 d 对于基本对象:

    object o = d;
    

    如果不首先取消装箱,则无法直接强制转换装箱值,这就是为什么直接强制转换为int失败的原因,如下所示:

    int x = (int)o;
    

    但是,通过这样做(中间先转换为十进制):

    int x = (int)(decimal)o;
    

    你先拆箱 o ,这意味着您正在检索十进制值, 然后 将未装箱的十进制值强制转换为int,这是因为c支持将小数强制转换为int。

        3
  •  9
  •   Frédéric Hamidi    14 年前

    decimal 有一个 explicit cast operator int . object 不:

    decimal d = 10m;
    object o = d;
    int x = (int)d;  // OK, calls decimal.explicit operator int(d).
    int y = (int)o;  // Invalid cast.
    
        4
  •  3
  •   Semyazas    14 年前

    你需要考虑的是,拳击和拆箱并不是一种转换。只需将对象类型“环绕”在初始的十进制类型上。这就是为什么在将对象转换为整数之前,需要先取消对象的装箱。