【问题标题】:Cannot convert Type `ClassA` to T无法将类型“ClassA”转换为 T
【发布时间】:2013-04-02 19:01:32
【问题描述】:

我正在用 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&lt;MamConfiguration&gt;

我得到编译错误:

无法将 MamConfiguration 类型的表达式转换为 T 类型

为什么会这样?

有没有什么办法可以解决不强制这两种方法返回IList&lt;MamConfiguration&gt;

【问题讨论】:

  • 请在以后的帖子中更加注意格式化代码。在发布之前查看预览,并考虑这是否是真的您希望人们看到的。
  • 为什么你的方法没有返回MamConfigurationIEnumerable&lt;MamConfiguration&gt;? (通过将单个结果包装在第一个分支中的列表中或在第二个分支中获取第一项。)代码对我来说看起来很奇怪,似乎它所做的只是模糊了 InvalidCastException 的原因。

标签: c# asp.net generics


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    geoConfigs = GetGeoConfigurationNumericFromDB(items, maMDBEntities) as T;
    

    【讨论】:

    • 就我个人而言,这里最好使用常规演员阵容。调试明显的类型转换失败(带有包含两种类型的消息)比调试没有任何上下文的随机空引用要容易得多。
    • @MarcGravell 我同意.. 但整个方法很奇怪。它根据字符串值返回完全不同的值。但是,不是一个额外的空值检查,它会抛出一个异常告诉你,你调用的是一个无效类型的方法,然后是一个强制转换异常?
    • Ehm.. 它确实有类约束?
    • 哎呀,我错过了类约束。我的错。另一个:当然-但是您需要添加执行空检查的代码,该代码会引发异常,告诉您您正在使用无效类型调用该方法:)
    猜你喜欢
    • 2022-11-25
    • 2019-12-02
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多