什么';将对象强制转换为valuetype时,解决c#取消装箱异常的最佳方法是什么?
我刚刚将VB.NET中的一段代码片段转换为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" 现在我的问题是,哪种方式最聪明 目前我的代码看起来像
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
}