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(); } } }
我试图为使用抽象基类和派生类的服务创建一个通用接口。从通用接口我创建了两个实现,每个派生类型一个。我有这个设置,没有任何问题 我的问题出现在我的使用类。。。。。现在我试图避免使用IOC(unity等)。我想设置usage类来创建基本服务类的实例,然后将实例强制转换为所选的derivedservice实现 我相信只要团结一致就可以做到这一点。。。。我计划最终使用它。。。但现在我只想做一些简单的事情,让自己站起来开始跑步。。。我的代码可以编译,但在运行时,我在以下模式中遇到错误: 无法将类型为“DerviedService”的对象强制转换为类型为“iBaseService`1[mybase]”的对象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
我曾尝试使用接口来代替抽象类,但这并没有解决问题。您的接口不是协变的-当您声明它时,它需要显式协变。因此:
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