无法将类型“ClassA”转换为T
本文关键字:转换 ClassA 类型 | 更新日期: 2023-09-27 18:07:06
我正在用c#编写一个通用方法:
private T GetMamConfigurations<T>(IDictionary<string, object> items,
MaMDBEntities maMDBEntities) where T : class
{
T geoConfigs = default(T);
if (typeStr.Equals("MamConfiguration", StringComparison.OrdinalIgnoreCase))
{
geoConfigs = (T)GetGeoConfigurationNumericFromDB(items, maMDBEntities);
}
else if (typeStr.Equals("ListOfMamConfiguration", StringComparison.OrdinalIgnoreCase))
{
geoConfigs = (T)GetGeoConfigurationsPercentageFromDB(items, maMDBEntities);
}
return geoConfigs;
}
GetGeoConfigurationNumericFromDB
返回MamConfiguration
与
GetGeoConfigurationsPercentageFromDB
返回IList<MamConfiguration>
,我得到复杂错误:
不能将
MamConfiguration
类型的表达式强制转换为T
类型
为什么?
有没有办法在不强制两个方法返回IList<MamConfiguration>
的情况下解决?
嗯,你总是可以通过在中间添加一个object
强制转换来安抚编译器:
geoConfigs = (T)(object)GetGeoConfigurationNumericFromDB(items, maMDBEntities);
将延迟类型检查直到运行时。然而!编译器没有办法做到这一点,因为它永远不会对"MamConfiguration"
这样的字符串测试感到满意。此外,当代码是……generic—即每个类型做同样的事情。所示的代码与通用的相反。它是通过泛型API公开的非泛型代码。里面总是会很乱。就我个人而言,我首先会尽量避免这种用法。
可以使用as
操作符,而不是使用(T)
来强制转换为T
。如果转换失败,as
将返回null
。如果成功,它将返回转换后的值。
geoConfigs = GetGeoConfigurationNumericFromDB(items, maMDBEntities) as T;