2016-11-13 115 views
1

在我们的应用程序的深处,有一个尝试执行从一个字符串转换为可空的int与Convert.ChangeType(value, castType)。在这种情况下,值如下:无法将字符串的类型更改为int?

value: "00010" 
castType: Nullable<System.Int16> 

的问题是,我收到以下错误

Invalid cast from 'System.String' to 'System.Nullable`1[[System.Int16} 

我有(显然不正确地)认为这是类似于铸造或Convert.ToInt16 ()但我通过测试以下两行代码验证了它不一样。

Int16 t = Convert.ToInt16("00010"); 
object w = Convert.ChangeType("00010", typeof(short?)); 

正如您可能会怀疑的那样,第一次成功,而第二次失败并出现上述错误消息。

是否可以通过调整来使用ChangeType或者我应该查看一个重构?

+0

我最终根据李的信息nk:'Convert.ChangeType(value,Nullable.GetUnderlyingType(castType)?? castType);' – McArthey

回答

2

你需要写的是这样的:

var value = "00010"; 
short? w = value == null ? null : (short?)Convert.ChangeType("00010", typeof(short)); 

ChangeType不会Nullable<T>工作 - 如果我们有一个价值value,我们假设我们有一个转换类型的值

+0

这是有价值的,但是我的类型值是在'typeof(T).GetProperty()。PropertyType'的运行时设置的,所以我不确定如果我可以做一个显式的转换 – McArthey

2

根据Convert.ChangeType

ChangeType(Object, Type)方法可以为null的类型转换为另一种类型。但是,即使conversionTypeNullable<T>的基础类型,它也无法将其他类型转换为可为空的类型的值。 要执行转换,可以使用铸造运算符(在C#中)或转换函数(在Visual Basic中)。

所以,尽量:

var w = (short?)Convert.ChangeType("00010", typeof(short)); 
+0

我完全错过了粗体部分。谢谢你指出。 – McArthey

相关问题