为什么如果十进制值作为输入给出,则对象类型不能转换为 int,就好像在给定整数值时可以强制转换一样

本文关键字:转换 整数 一样 int 输入 十进制 如果 对象 为什么 不能 类型 | 更新日期: 2023-09-27 18:35:16

我是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()来转换值 到整数,但我不支持该解决方案。我只是好奇知道 原因。

如果有人可以帮助我了解原因。提前谢谢。

为什么如果十进制值作为输入给出,则对象类型不能转换为 int,就好像在给定整数值时可以强制转换一样

欢迎来到 C# 世界Boxing and Unboxing。在这种情况下,代码尝试将object类型值Unboxint类型。

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

因此,您的应用程序无法取消装箱,因为值类型是十进制,但您希望强制转换 int 类型。您必须首先转换为类似的类型,然后执行数值转换。你可以这样做:

int b = (int)(double)a;

在这里(double)执行拆箱并(int)执行数字转换。

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