2009-07-20 59 views
4

我刚刚将VB.NET的代码片段转换为C#,并且偶然发现了这个问题。将对象转换为值类型时,解决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开销少,我猜。

+0

是否有一个原因,你正在创建新的对象y,而不是让.net只是盒x你? – kemiller2002 2009-07-20 13:37:52

+0

欲了解更详细的问题以及为什么它的行为如此,你可以阅读http://blogs.msdn.com/ericlippert/archive/2009/03/19/representation-and-identity.aspx – SolutionYogi 2009-07-20 13:42:39

回答

7

(decimal)(int)x是这样做的正确方法,如果您期望盒装对象是一个整数。转换为字符串和解析并不是一个很好的方法来解决问题并导致一些开销。

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

10

如何:

z = Convert.ToDecimal(y); 
2

Convert.ToDecimal(Y);

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为=“驴”,你可以处理它没有抛出异常的方式。当然,如果z不能被转换,你可能更喜欢抛出异常。只是另一种选择...

相关问题