在将对象转换为valuetype时,解决c#unboxing异常的最佳方法是什么?

Jür*_*ock 4 c# unboxing

我刚刚将一个代码片段从VB.NET转换为C#,并偶然发现了这个问题.

考虑以下代码:

    Dim x As Integer = 5
    Dim y As Object = x
    Dim z As Decimal = CType(y, Decimal)
Run Code Online (Sandbox Code Playgroud)

编译器或运行时没有错误.z是五.

现在让我们将此代码翻译为C#

    int x = 5;
    object y = x;
    decimal z = (decimal)y;
Run Code Online (Sandbox Code Playgroud)

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

    Cannot unbox "y" to "decimal"
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,这将是最聪明的C#方式.

目前我的代码看起来像.

    int x = 5;
    object y = x;
    decimal z = decimal.Parse(y.ToString());
Run Code Online (Sandbox Code Playgroud)

但另一种解决方案是:

    decimal z = (decimal)(int)y;
Run Code Online (Sandbox Code Playgroud)

这看起来有点混乱,但可能比decimal.Parse更少开销.

Dmi*_*ant 10

怎么样:

z = Convert.ToDecimal(y);
Run Code Online (Sandbox Code Playgroud)


Meh*_*ari 7

(decimal)(int)x如果您希望盒装对象是整数,那么这是正确的方法.转换为字符串和解析不是攻击问题的好方法,并且会产生一些开销.

如果您只是知道可以以decimal某种方式转换对象,请尝试System.Convert.ToDecimal方法.它会为你处理.