我是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()
来转换价值 到整数,但我不是那个解决方案。我很想知道 原因。
如果有人能帮我理解原因。提前谢谢。
答案 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()
在这种情况下,您必须检查类型 第一