如果给出十进制值作为输入,为什么对象类型不能转换为int,就好像它可以在给出Integer值时转换?

时间:2016-02-18 12:30:33

标签: c# .net

我是C#的新手,刚开始学习它。我试图创建一个Mathematics类,我已经为其添加了一个方法Add。此方法将使用当前值添加数字。

实施如下:

public class Mathmatics
{
    private int value = 0;
    public int Add(object a)
    {
        int b;
        int b = (int)a; //Thorws this error "InvalidCastException: Specified cast is not valid." for value 10.5 or any other decimal value.
        this.value += b;
        return this.value;
    }
}

如果我给任何integer类型的输入值,上面的方法工作正常。但是对于decimal类型值,它会失败。

我的问题是,如果给出十进制值作为输入,object类型无法强制转换为int,就好像它可以在给出Integer值时强制转换一样?

  

我发现我可以使用Convert.ToInt32()来转换价值   到整数,但我不是那个解决方案。我很想知道   原因。

如果有人能帮我理解原因。提前谢谢。

1 个答案:

答案 0 :(得分:1)

欢迎来到Boxing and Unboxing的C#世界。在这种情况下,您的代码尝试Unbox object类型值为int类型。

第一件事是Unboxing将引用类型实例转换为值类型。拆箱需要显式转换。运行时检查 声明value type与实际object type匹配,如果检查失败则会抛出InvalidCastException

由于这个原因,您的应用程序未能通过Unbox,因为值类型是十进制但您想要转换int类型。您必须首先转换为相似类型然后执行数字转换。你可以这样做:

int b = (int)(double)a;

此处(double)执行取消装箱并(int)执行数字转换。

  

但是要小心,如果你使用这个代码而不检查类型,你会的   面向int类型值的问题作为输入(与之前相同的原因)。所以,   你必须首先检查类型,然后取消装箱。所以,它更好用   Convert.ToInt32()在这种情况下,您必须检查类型   第一