【问题标题】:Generic Superclass and type mismatch泛型超类和类型不匹配
【发布时间】:2015-04-20 06:03:42
【问题描述】:

我有一个通用基类:

public abstract BaseClass<T> where T: IMyModels {
     ...
}

还有一个子类:

public class MyFirstsubClass: BaseClass<MyFirstModel> {
     ...
}

这些是接口和模型:

public interface IMyModel {} // Empty Interface 

public MyFirstModel: IMyModel {
   // Some automatic properties
}

由于 MyFirstClass 扩展为 BaseClass,其类型正在实现 IMyModel 接口,所以下面的代码必须没问题,但 Visual Studio 显示“无法隐式转换类型”错误,当我进行显式转换时,它说类型不能被显式强制转换。

BaseClass<IMyModel> Temp = new MyFirstsubClass();

这个结构到底有什么问题,我该如何修改它以便修复上述代码的问题?

【问题讨论】:

    标签: c# generics inheritance interface hierarchy


    【解决方案1】:

    由于MyFirstClass 扩展为BaseClass,其类型正在实现IMyModel 接口,所以下面的代码一定没问题

    不,BaseClass&lt;MyFirstModel&gt; 不是 BaseClass&lt;IMyModel&gt;,因为泛型类默认情况下不是协变的。假设你有一个方法:

    public void Process(T model)
    {
        ...
    }
    

    对于BaseClass&lt;MyFirstModel&gt;,此方法编译为

    public void Process(MyFirstModel model)
    {
        ...
    }
    

    现在假设您可以将其转换为 BaseClass&lt;IMyModel&gt;。然后将IMyModel 的其他一些实现传递给Process 是合法的,它期望一个MyFirstModel 并且可能会严重失败。

    我该如何修改它以解决上述代码的问题?

    您唯一能做的就是将其声明为 BaseClass&lt;MyFirstModel&gt;

    BaseClass<MyFirstModel> Temp = new MyFirstsubClass();
    

    不知道BaseClass&lt;T&gt; 是做什么的;不可能知道是否有合理的方法将其转换为BaseClass&lt;IMyModel&gt;

    【讨论】:

    • 那么混乱是因为IMyModel I = new MyFirstModel() 这没关系,如果你删除通用部分然后BaseClass B = new MyFirstsubclass(),但是当添加通用时,理论上应该可以工作。
    • “不知道 BaseClass 做了什么”我需要一个 List&lt;BaseClass&lt;IMyModel&gt;
    • 不,不应该。由于所描述的原因,不能将具有派生泛型参数的泛型类强制转换为具有基本泛型参数的同一个泛型类。 Generic interfaces 可以是协变的,但泛型类不能
    • @Tom "我需要一个List&lt;BaseClass&lt;IMyModel&gt;" 这不是我的意思——它有什么方法/属性?如果所有方法都只有 output Ts 那么你可以定义一个基本接口并使 that 协变。如果任何方法允许输入,则无法转换为 BaseClass&lt;{base class of T&gt;
    • 一个接口可以工作,但是抽象类有很多我可以在子类中重用的方法,所以如果使用 BaseClass 会更干净并且管理得很好。但问题是我编写了另一个使用依赖注入的类,它有一个List&lt;Base&lt;IModel&gt;&gt; 类型的参数。所以问题是我不能将任何东西传递给该列表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多