我正在尝试将子类强制转换为其父类,但是我收到了InvalidCastException。我的代码如下:
public class RepositoryMock<T> : IRepository<T> where T : ICleanableEntity
{ ... }
然后我有以下课程:
public class Telemetry : ICleanableEntity
{ .. }
以及以下方法:
public List<IRepository<ICleanableEntity>> GetCleanableRepositories()
{
var repo = new RepositoryMock<Telemetry>();
return new List<IRepository<ICleanableEntity>> { (IRepositort<ICleanableEntity>)repo };
}
先前的代码可以编译,但是会引发InvalidCastException。
我对C#的经验不是很丰富,我来自Java世界,在这方面可以实现,但是我检查了C#的文档,并指出可以通过差异来完成。谁能给我一个提示,为什么我不能从子类转换为父类?
答案 0 :(得分:2)
您的IRepository<>
接口需要通过其一般声明中的out
为covariant:
public interface IRepository<out T>{ ... }
如果在通用签名中添加out
会导致其他编译器错误出现,则可能是您的演员表确实无效。例如,您说,该仓库可以处理ICleanableEntity
个对象,但是如果有人在您的repo.Add(new Foo())
上调用RepositoryMock<Telemetry>
,而Foo
是不是Telemetry
,您期望发生什么?
在这种情况下,您可能需要考虑将IRepository<>
接口的协变部分分成一个单独的接口,以便在您确实只想使用这些方法而无需调用诸如{ {1}}。