在接口上使用协方差…运行时错误无法强制转换'类型的对象;iBaseService ' 1[mybase]'

本文关键字:对象 类型 iBaseService mybase 转换 接口 方差 运行时错误 | 更新日期: 2023-09-27 17:49:41

using System; 
using System.Collections.Generic;

namespace mymodels
{
public abstract class mybase
{
     public string v1 {get; set;}
}     

public class derivedA : mybase
{
      public string v2 {get; set;}
}

public class derivedB : mybase
{
      public string v2 {get; set;}
}
} 

namespace myservices 
{
interface iBaseService<T>  where T : mymodels.mybase
{
    T   Get ();
}

public class derviedAService : iBaseService<mymodels.derivedA>
{
    public derviedAService (){}
    public mymodels.derivedA Get()
    {
        mymodels.derivedA d = new mymodels.derivedA();
        return d;
    }
}   

public class derviedBService : iBaseService<mymodels.derivedB>
{
    public derviedBService (){}
    public mymodels.derivedB Get()
    {
        mymodels.derivedB d = new mymodels.derivedB();
        return d;
    }
}
}

namespace m
{
public class user
{
    myservices.iBaseService<mymodels.mybase> myservice = null;

    public user()
    {
        bool mode1 = true;
        if (mode1)
            myservice = (myservices.iBaseService<mymodels.mybase>)new myservices.derviedAService();
        else
            myservice = (myservices.iBaseService<mymodels.mybase>)new myservices.derviedBService();
    }   
}   
}   

我正在尝试为使用抽象基类和派生类的服务创建一个通用接口。我从泛型接口创建了两个实现,每个实现对应一个派生类型。我有这样的设置,没有任何问题....

我的问题出现在我的用法类.....现在我尽量避免使用IOC(统一等等)。我想设置usage类来创建一个基服务类的实例,然后将实例类型强制转换为选定的派生服务实现…

我相信这可以用unity....完成我打算最终使用它…但现在我只想做一些简单的事情来启动和运行……我的代码编译,但在运行时,我得到一个错误在以下模式:

无法将类型'derviedAService '的对象强制转换为类型'iBaseService ' 1[mybase]'.

我已经尝试使用一个接口来代替抽象类,但这并没有解决问题。

在接口上使用协方差…运行时错误无法强制转换'类型的对象;iBaseService ' 1[mybase]'

你的接口不是协变的——当你声明它时,它需要显式地协变。所以这:

interface iBaseService<T>  where T : mymodels.mybase
应:

interface iBaseService<out T>  where T : mymodels.mybase

…除了还应该遵循。net命名约定,使用PascalCase命名空间、类型和方法名。你的代码现在非常非常规