无法将实例类型转换为实例实现接口的接口类型

时间:2016-02-22 08:15:56

标签: c# generics

为什么给出以下类

class ParentClass<T>{   }
class ChildClass : IInterface{  }
interface IInterface{   }

当我尝试使用以下代码从ParentClass<ChildClass>类型转换为ParentClass<IInterface>时,是否会收到编译时错误“无法转换类型”。

var concreteGeneric = new ParentClass<ChildClass>();
var interfaceGeneric = (ParentClass<IInterface>)concreteClass;

2 个答案:

答案 0 :(得分:1)

这里你需要的是协方差和(如@xanatos所提到的)它只支持接口。如果您向ParentClass添加了一个界面,则可以转换为IParentClass<IInterface>并获得您要查找的功能。

class ParentClass<T> : IParentClass<T> where T : IInterface { }
class ChildClass : IInterface { }
interface IInterface { }
interface IParentClass<out T> where T : IInterface { }

public void TestMethodX()
{
    var concreteGeneric = new ParentClass<ChildClass>();
    var interfaceGeneric = (IParentClass<IInterface>)concreteGeneric;
}

答案 1 :(得分:0)

尝试精确指定哪个接口扩展T

class ParentClass<T> where T:IInterface {   }