Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.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
什么';将对象强制转换为valuetype时,解决c#取消装箱异常的最佳方法是什么?_C#_Unboxing - Fatal编程技术网

什么';将对象强制转换为valuetype时,解决c#取消装箱异常的最佳方法是什么?

什么';将对象强制转换为valuetype时,解决c#取消装箱异常的最佳方法是什么?,c#,unboxing,C#,Unboxing,我刚刚将VB.NET中的一段代码片段转换为C#,并无意中发现了这个问题 考虑以下代码: Dim x As Integer = 5 Dim y As Object = x Dim z As Decimal = CType(y, Decimal) 编译器或运行时没有错误。z是五 现在让我们把这段代码翻译成C# 编译器没有错误,但在运行时引发异常: Cannot unbox "y" to "decimal" 现在我的问题是,哪种方式最聪明 目前我的代码看起来像

我刚刚将VB.NET中的一段代码片段转换为C#,并无意中发现了这个问题

考虑以下代码:

    Dim x As Integer = 5
    Dim y As Object = x
    Dim z As Decimal = CType(y, Decimal)
编译器或运行时没有错误。z是五

现在让我们把这段代码翻译成C#

编译器没有错误,但在运行时引发异常:

    Cannot unbox "y" to "decimal"
现在我的问题是,哪种方式最聪明

目前我的代码看起来像

    int x = 5;
    object y = x;
    decimal z = decimal.Parse(y.ToString());
但另一个解决办法是:

    decimal z = (decimal)(int)y;
这看起来有点混乱,但可能比十进制的开销要小。我猜是解析。

怎么样:

z = Convert.ToDecimal(y);
转换为特定值(y)

(十进制)(int)x
是正确的方法,如果您希望装箱的对象是整数。转换为字符串和解析并不是解决问题的好方法,并且会产生一些开销


如果您刚刚知道可以通过某种方式将对象转换为
decimal
,请尝试
System.Convert.ToDecimal
方法。它会帮你处理的。

如果你想完全安全,你可以尝试:

    int x = 5;
    object y = x;
    decimal z;
    if (Decimal.TryParse(y.ToString(), out z))
    {
        // z is a decimal
    }
    else
    {
        // z is not a decimal
    }

这样,如果有人将y设置为=“驴子”,您就可以处理它而不会抛出异常。当然,如果z无法转换,您可能更愿意抛出异常。只是另一个选项…

您创建新对象y而不让.net为您设置x框有什么原因吗?要更详细地了解这个问题以及为什么会出现这种情况,您可以阅读@Kevin:这段代码只是一个示例。我的读取代码是一个以对象作为参数的函数。这不是必需的,我知道我的对象是数值的。如果不是这样,vb中的CType也会抛出异常。
    int x = 5;
    object y = x;
    decimal z;
    if (Decimal.TryParse(y.ToString(), out z))
    {
        // z is a decimal
    }
    else
    {
        // z is not a decimal
    }