为什么如果十进制值作为输入给出,则对象类型不能转换为 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()
来转换值 到整数,但我不支持该解决方案。我只是好奇知道 原因。
如果有人可以帮助我了解原因。提前谢谢。
欢迎来到 C# 世界Boxing and Unboxing
。在这种情况下,代码尝试将object
类型值Unbox
为int
类型。
第一件事是Unboxing
引用类型实例强制转换为值类型。拆箱需要显式强制转换。运行时检查声明value type
与实际object type
匹配,如果检查失败,则抛出InvalidCastException
。
因此,您的应用程序无法取消装箱,因为值类型是十进制,但您希望强制转换 int 类型。您必须首先转换为类似的类型,然后执行数值转换。你可以这样做:
int b = (int)(double)a;
在这里(double)
执行拆箱并(int)
执行数字转换。
但要小心,如果你使用这段代码而不检查类型,你会 面临 int 类型值作为输入的问题(与之前的原因相同)。所以 您必须先检查类型,然后再取消装箱。所以,最好使用
Convert.ToInt32()
在这种情况下,您必须检查类型 第一。