4

我在我们的代码库中遇到了一个抛出错误的函数:

public static T InternalData<T>()
{
    return (T)"100";
}

显然我已经简化了代码并将“100”添加为文字字符串值。T 属于 类型int

它抛出一个:

System.InvalidCastException:指定的强制转换无效。

似乎您无法int在 C# 中隐式转换字符串,我该如何修复此代码以便它可以处理转换任何泛型类型?

实际代码如下所示:

public static T InternalData<T>()
{
    return (T) something (not sure of type or data);
}
4

4 回答 4

11

尝试:

public static T InternalData<T>(object data)
{
     return (T) Convert.ChangeType(data, typeof(T));
}

这适用于实现IConvertible接口的类型(which Int32and Stringdoes)。

于 2012-09-05T12:51:45.933 回答
7

一种可能性是使用

return (T)Convert.ChangeType(yourValue, typeof(T));

yourValue请注意,如果不是实现的类型的实例,这将引发异常IConvertible。如果值本身无法转换,它也会抛出异常,例如如果你有“abc”而不是“100”。

于 2012-09-05T12:52:17.473 回答
4

使用Convert.ChangeType.

public static T InternalData<T>()
{
    return (T)Convert.ChangeType("100", typeof (T));
}

如果无法转换值,它仍然会抛出错误,但它不会尝试进行直接转换。它可以将字符串转换为整数。

于 2012-09-05T12:52:50.083 回答
1

不要混淆铸造和转换!如果编译器不知道表达式的真实类型,例如因为它的类型为object,并且您知道它的固有类型,则可以告诉 C# 编译器,“嘿,我知道它是 a int,所以请把它当作 a int” .

 (int)expression

在您的情况下,表达式是一个字符串表达式,不能转换为int,只是因为它不是int. 但是,您可以将字符串转换为int是否表示有效整数。此外,您的转换结果类型是未知的,因为它是通用的。(T)Convert.ChangeType(...)像其他人已经建议的那样使用。

于 2012-09-05T13:02:52.147 回答