Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么当十进制值作为输入时,对象类型不能转换为int,就像当给定整数值时可以转换一样?_C#_.net - Fatal编程技术网

C# 为什么当十进制值作为输入时,对象类型不能转换为int,就像当给定整数值时可以转换一样?

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

我对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 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
而不是
对象