C# 在接口上使用协方差…运行时错误无法强制转换类型为';derviedAService';输入';iBaseService`1[mybase]&x27; 使用系统; 使用System.Collections.Generic; 名称空间mymodels { 公共抽象类mybase { 公共字符串v1{get;set;} } 公共类derivedA:mybase { 公共字符串v2{get;set;} } 公共类derivedB:mybase { 公共字符串v2{get;set;} } } 命名空间myservices { 接口iBaseService,其中T:mymodels.mybase { T Get(); } 公共类DerviedService:iBaseService { 公共derviedAService(){} public mymodels.derivedA Get() { mymodels.derivedA d=新的mymodels.derivedA(); 返回d; } } 公共类derviedBService:iBaseService { 公共derviedBService(){} public mymodels.derivedB Get() { mymodels.derivedB d=新的mymodels.derivedB(); 返回d; } } } 名称空间m { 公共类用户 { myservices.iBaseService myservice=null; 公共用户() { bool mode1=真; 如果(模式1) myservice=(myservices.iBaseService)新建myservices.derviedAService(); 其他的 myservice=(myservices.iBaseService)newmyservices.derviedBService(); } } }

C# 在接口上使用协方差…运行时错误无法强制转换类型为';derviedAService';输入';iBaseService`1[mybase]&x27; 使用系统; 使用System.Collections.Generic; 名称空间mymodels { 公共抽象类mybase { 公共字符串v1{get;set;} } 公共类derivedA:mybase { 公共字符串v2{get;set;} } 公共类derivedB:mybase { 公共字符串v2{get;set;} } } 命名空间myservices { 接口iBaseService,其中T:mymodels.mybase { T Get(); } 公共类DerviedService:iBaseService { 公共derviedAService(){} public mymodels.derivedA Get() { mymodels.derivedA d=新的mymodels.derivedA(); 返回d; } } 公共类derviedBService:iBaseService { 公共derviedBService(){} public mymodels.derivedB Get() { mymodels.derivedB d=新的mymodels.derivedB(); 返回d; } } } 名称空间m { 公共类用户 { myservices.iBaseService myservice=null; 公共用户() { bool mode1=真; 如果(模式1) myservice=(myservices.iBaseService)新建myservices.derviedAService(); 其他的 myservice=(myservices.iBaseService)newmyservices.derviedBService(); } } },c#,generics,interface,C#,Generics,Interface,我试图为使用抽象基类和派生类的服务创建一个通用接口。从通用接口我创建了两个实现,每个派生类型一个。我有这个设置,没有任何问题 我的问题出现在我的使用类。。。。。现在我试图避免使用IOC(unity等)。我想设置usage类来创建基本服务类的实例,然后将实例强制转换为所选的derivedservice实现 我相信只要团结一致就可以做到这一点。。。。我计划最终使用它。。。但现在我只想做一些简单的事情,让自己站起来开始跑步。。。我的代码可以编译,但在运行时,我在以下模式中遇到错误: 无法将类型为“De

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

我的问题出现在我的使用类。。。。。现在我试图避免使用IOC(unity等)。我想设置usage类来创建基本服务类的实例,然后将实例强制转换为所选的derivedservice实现

我相信只要团结一致就可以做到这一点。。。。我计划最终使用它。。。但现在我只想做一些简单的事情,让自己站起来开始跑步。。。我的代码可以编译,但在运行时,我在以下模式中遇到错误:

无法将类型为“DerviedService”的对象强制转换为类型为“iBaseService`1[mybase]”的对象


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

您的接口不是协变的-当您声明它时,它需要显式协变。因此:

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();
    }   

}   
}   
接口iBaseService,其中T:mymodels.mybase
应该是:

interface iBaseService<T>  where T : mymodels.mybase
接口iBaseService,其中T:mymodels.mybase

。。。除此之外,您还应该遵循.NET命名约定,对名称空间、类型和方法名称使用PascalCase。您的代码目前非常非常规。

如果您能在问题中更容易地格式化代码,并且给出最少的示例,这将非常有帮助。您真的不需要83行代码来演示这一点。此外,即使您个人不遵守.NET命名约定(我强烈建议您开始这样做),对于这样的示例代码,这样做也是值得的-您应该让我们尽可能容易地阅读。对于代码,很抱歉…下次我将花更多时间在命名上。。。然而你的解决方案是正确的。。。这就是缺少的,代码现在可以工作了。非常感谢。
interface iBaseService<out T>  where T : mymodels.mybase