0

我正在用 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>

4

2 回答 2

1

好吧,您总是可以通过在中间添加强制转换来安抚编译器:object

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

这会将类型检查推迟到运行时。然而!否则没有编译器方法可以做到这一点,因为它永远不会对像"MamConfiguration". 此外,当代码是……泛型时,泛型也能很好地工作——即每种类型都做同样的事情。显示的代码与generic相反。它是通过通用 API 公开的非通用代码。里面总是乱七八糟的。就我个人而言,我首先会尽量避免这种用法。

于 2013-04-02T10:54:25.630 回答
0

您可以使用运算符,而不是使用(T)to cast to 。如果转换失败将返回。如果成功,它将返回您的转换值。Tasasnull

geoConfigs = GetGeoConfigurationNumericFromDB(items, maMDBEntities) as T;
于 2013-04-02T10:53:48.093 回答