无法将类型“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>的情况下解决?

无法将类型“ClassA”转换为T

嗯,你总是可以通过在中间添加一个object强制转换来安抚编译器:

geoConfigs = (T)(object)GetGeoConfigurationNumericFromDB(items, maMDBEntities);

将延迟类型检查直到运行时。然而!编译器没有办法做到这一点,因为它永远不会对"MamConfiguration"这样的字符串测试感到满意。此外,当代码是……generic—即每个类型做同样的事情。所示的代码与通用的相反。它是通过泛型API公开的非泛型代码。里面总是会很乱。就我个人而言,我首先会尽量避免这种用法。

可以使用as操作符,而不是使用(T)来强制转换为T。如果转换失败,as将返回null。如果成功,它将返回转换后的值。

geoConfigs = GetGeoConfigurationNumericFromDB(items, maMDBEntities) as T;