C#泛型和类型转换

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

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

```
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);
}
4个回答

11

尝试:

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

这适用于实现了IConvertible接口的类型(包括Int32String)。


我以前从未使用过ChangeType方法,不知道这个方法的存在 - 谢谢 - 现在正在测试! - JL.

7
一种可能性是使用
return (T)Convert.ChangeType(yourValue, typeof(T));

请注意,如果yourValue不是实现IConvertible接口的类型的实例,则会抛出异常。如果值本身无法转换,例如使用"abc"而不是"100",也会抛出异常。

4
使用Convert.ChangeType函数。
public static T InternalData<T>()
{
    return (T)Convert.ChangeType("100", typeof (T));
}

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


1
不要混淆转换和强制类型转换!如果编译器不知道表达式的真实类型,例如因为它被定义为object,而你知道它的固有类型,你可以告诉C#编译器:“嘿,我知道它是一个int,所以请把它当作int处理”。
 (int)expression

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接