我在代码库中遇到了一个抛出错误的函数:
public static T InternalData<T>()
{
return (T)"100";
}
显然我已经简化了代码并添加了“100”作为文字字符串值。 T的类型为int
。
它抛出一个:
System.InvalidCastException:指定的强制转换无效。
您似乎无法在C#中将字符串隐式转换为int
,如何修复此代码以便它可以处理转换任何泛型类型?
实际代码看起来像这样:
public static T InternalData<T>()
{
return (T) something (not sure of type or data);
}
答案 0 :(得分:11)
尝试:
public static T InternalData<T>(object data)
{
return (T) Convert.ChangeType(data, typeof(T));
}
这适用于实现IConvertible
界面的类型(Int32
和String
都有)。
答案 1 :(得分:7)
一种可能性是使用
return (T)Convert.ChangeType(yourValue, typeof(T));
请注意,如果yourValue
不是实现IConvertible
的类型的实例,则会引发异常。如果值本身无法转换,它也会抛出异常,例如,如果你有“abc”而不是“100”。
答案 2 :(得分:4)
使用Convert.ChangeType
。
public static T InternalData<T>()
{
return (T)Convert.ChangeType("100", typeof (T));
}
如果无法转换值,它仍然会抛出错误,但它不会尝试直接转换。它可以将字符串转换为整数。
答案 3 :(得分:1)
不要混淆铸造和转换!如果编译器不知道表达式的真实类型,例如因为它被输入为object
,你知道它的固有类型,你可以告诉C#编译器,“嘿,我知道它是int
,所以请把它当作int
”
(int)expression
在您的情况下,表达式是一个无法转换为int
的字符串表达式,只需将其表示为int
。但是,如果字符串表示有效整数,则可以将其转换为int
。此外,转换的结果类型未知,因为它是通用的。正如其他人已经建议的那样使用(T)Convert.ChangeType(...)
。