C#泛型和铸造

C#泛型和铸造,c#,generics,casting,C#,Generics,Casting,我在代码库中遇到一个函数抛出错误: public static T InternalData<T>() { return (T)"100"; } 尝试: publicstatict内部数据(对象数据) { return(T)Convert.ChangeType(数据,typeof(T)); } 这适用于实现IConvertible接口的类型(Int32和String有此功能)。一种可能是使用 return (T)Convert.ChangeType(yourValue,

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

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

publicstatict内部数据(对象数据)
{
return(T)Convert.ChangeType(数据,typeof(T));
}

这适用于实现
IConvertible
接口的类型(Int32和
String
有此功能)。

一种可能是使用

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

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

使用
Convert.ChangeType

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

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

不要混淆强制转换和转换!如果编译器不知道表达式的真实类型,例如,因为它的类型为
对象
,并且您知道它的固有类型,那么您可以告诉C编译器,“嘿,我知道它是
int
,所以请将其视为
int


在您的例子中,表达式是一个字符串表达式,不能强制转换为
int
,因为它不是
int
。但是,如果字符串表示有效整数,则可以将其转换为
int
。此外,转换的结果类型未知,因为它是泛型的。使用
(T)Convert.ChangeType(…)
,正如其他人所建议的那样。

我以前从未使用过ChangeType,不知道该方法存在-谢谢-现在就开始测试!太好了:)很高兴我能帮忙:)
return (T)Convert.ChangeType(yourValue, typeof(T));
public static T InternalData<T>()
{
    return (T)Convert.ChangeType("100", typeof (T));
}
 (int)expression