4

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

考虑这段代码:

    Dim x As Integer = 5
    Dim y As Object = x
    Dim z As Decimal = CType(y, Decimal)

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

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

    int x = 5;
    object y = x;
    decimal z = (decimal)y;

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

    Cannot unbox "y" to "decimal"

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

目前我的代码看起来像。

    int x = 5;
    object y = x;
    decimal z = decimal.Parse(y.ToString());

但另一个解决方案是:

    decimal z = (decimal)(int)y;

这看起来有点令人困惑,但我猜它的开销可能比 decimal.Parse 少。

4

4 回答 4

10

怎么样:

z = Convert.ToDecimal(y);
于 2009-07-20T13:35:08.800 回答
7

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

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

于 2009-07-20T13:37:15.243 回答
2

Convert.ToDecimal(y);

于 2009-07-20T13:36:16.990 回答
0

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

    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 设置为 = "donkey" 您可以处理它而不会引发异常。当然,如果 z 无法转换,您可能更愿意抛出异常。只是另一种选择...

于 2009-07-20T13:46:48.400 回答