不能隐式地将类型‘ Int’转换为‘ T’

我可以打 Get<int>(Stat);或者 Get<string>(Name);

但在编译时,我得到:

不能隐式地将类型‘ int’转换为‘ T’

string也是一样。

public T Get<T>(Stats type) where T : IConvertible
{
if (typeof(T) == typeof(int))
{
int t = Convert.ToInt16(PlayerStats[type]);
return t;
}
if (typeof(T) == typeof(string))
{
string t = PlayerStats[type].ToString();
return t;
}
}
114416 次浏览
public T Get<T>(Stats type ) where T : IConvertible
{
if (typeof(T) == typeof(int))
{
int t = Convert.ToInt16(PlayerStats[type]);
return (T)t;
}
if (typeof(T) == typeof(string))
{
string t = PlayerStats[type].ToString();
return (T)t;
}
}

您应该能够只使用 Convert.ChangeType()代替您的自定义代码:

public T Get<T>(Stats type) where T : IConvertible
{
return (T) Convert.ChangeType(PlayerStats[type], typeof(T));
}

看起来你需要一个 TypeConverter,见 这篇博文

任何时候您发现自己在泛型 几乎可以肯定你做错了什么中打开类型。泛型应该是 一般; 它们应该操作相同的 完全独立于类型

如果 T 只能是 int 或 string,那么一开始就不要用这种方式编写代码。编写两个方法,一个返回 int,一个返回 string。

ChangeType可能是你的最佳选择。我的解决方案与 BrokenGlass 提供的解决方案类似,只是使用了一点 try catch 逻辑。

static void Main(string[] args)
{
object number = "1";
bool hasConverted;
var convertedValue = DoConvert<int>(number, out hasConverted);


Console.WriteLine(hasConverted);
Console.WriteLine(convertedValue);
}


public static TConvertType DoConvert<TConvertType>(object convertValue, out bool hasConverted)
{
hasConverted = false;
var converted = default(TConvertType);
try
{
converted = (TConvertType)
Convert.ChangeType(convertValue, typeof(TConvertType));
hasConverted = true;
}
catch (InvalidCastException)
{
}
catch (ArgumentNullException)
{
}
catch (FormatException)
{
}
catch (OverflowException)
{
}


return converted;
}

考虑到@BrokenGlass 逻辑(Convert.ChangeType)不支持 GUID 类型。

public T Get<T>(Stats type) where T : IConvertible
{
return (T) Convert.ChangeType(PlayerStats[type], typeof(T));
}

错误 : 从‘ System.String’到‘ System.Guid’的转换无效。

相反,通过添加 System.ComponentModel名称空间使用 TypeDescriptor.GetConverter的下面的逻辑。

public T Get<T>(Stats type) where T : IConvertible
{
(T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromInvariantString(PlayerStats[type])
}

Read 这个.

试试这个:

public T Get<T>(Stats type ) where T : IConvertible
{
if (typeof(T) == typeof(int))
{
return (T)(object)Convert.ToInt16(PlayerStats[type]);


}
if (typeof(T) == typeof(string))
{


return (T)(object)PlayerStats[type];
}
}

实际上,你可以把它转换成 object,然后再转换成 T

T var = (T)(object)42;

bool的一个例子:

public class Program
{
public static T Foo<T>()
{
if(typeof(T) == typeof(bool)) {
return (T)(object)true;
}


return default(T);
}


public static void Main()
{
bool boolValue = Foo<bool>(); // == true
string stringValue = Foo<string>(); // == null
}
}

有时,这种行为是可取的。例如,当从基类或接口实现或重写泛型方法时,您希望基于 T类型添加一些不同的功能。