什么是投对象的值类型时,解决了C#拆箱异常的最好方法?

StackOverflow https://stackoverflow.com/questions/1153612

  •  18-09-2019
  •  | 
  •  

我刚转换的代码片段从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;

这看起来有点混乱,但propably比decimal.Parse开销少,我猜。

有帮助吗?

解决方案

(decimal)(int)x是这样,如果你期望的是盒装的对象是一个整数的正道。字符串转换和解析,不在于攻击问题的好办法,并会导致一些开销。

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

其他提示

如何:

z = Convert.ToDecimal(y);

Convert.ToDecimal(Y);

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

    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不能转换。又一个选项...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top