C# 为什么当十进制值作为输入时,对象类型不能转换为int,就像当给定整数值时可以转换一样?
我对C#是新手,刚刚开始学习。我试图创建一个C# 为什么当十进制值作为输入时,对象类型不能转换为int,就像当给定整数值时可以转换一样?,c#,.net,C#,.net,我对C#是新手,刚刚开始学习。我试图创建一个数学类,并为其添加了一个方法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 i
数学
类,并为其添加了一个方法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
type,则上述方法可以正常工作。但是对于decimal
类型值,它失败
我的问题是,如果输入的是十进制值,为什么对象
类型不能转换为int
,就好像它可以转换为整数
值一样
我发现我可以使用Convert.ToInt32()
来转换值
但我不赞成这个解决方案。我只是想知道
原因
如果有人能帮我理解原因。提前感谢。欢迎来到C#world of装箱和拆箱
。在这种情况下,您的代码尝试将对象类型值int
类型Unbox
第一件事是取消装箱
将引用类型实例转换为值类型。取消装箱需要显式强制转换。运行时检查
声明的值类型
与实际的对象类型
匹配,如果检查失败,则抛出InvalidCastException
由于这个原因,应用程序无法取消装箱,因为值类型是decimal,但您希望强制转换int类型。您必须首先转换为类似的类型,然后执行数字转换。您可以这样做:
int b = (int)(double)a;
此处(双精度)
执行取消装箱,并(int)
执行数字转换
但是要小心,如果您使用此代码而不检查类型,您将
作为输入的int类型值面临问题(原因与前面相同)。所以
您必须先检查类型,然后取消装箱。所以,使用它更好
Convert.ToInt32()
在这种情况下,否则必须检查类型
首先
为什么不让Add
方法采用int
而不是对象
?