从子级转换为父级时发生InvalidCastException

时间:2019-02-14 15:46:33

标签: c# casting

我正在尝试将子类强制转换为其父类,但是我收到了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#的文档,并指出可以通过差异来完成。谁能给我一个提示,为什么我不能从子类转换为父类?

1 个答案:

答案 0 :(得分:2)

您的IRepository<>接口需要通过其一般声明中的outcovariant

public interface IRepository<out T>{ ... }

如果在通用签名中添加out会导致其他编译器错误出现,则可能是您的演员表确实无效。例如,您,该仓库可以处理ICleanableEntity个对象,但是如果有人在您的repo.Add(new Foo())上调用RepositoryMock<Telemetry>,而Foo是不是Telemetry,您期望发生什么?

在这种情况下,您可能需要考虑将IRepository<>接口的协变部分分成一个单独的接口,以便在您确实只想使用这些方法而无需调用诸如{ {1}}。

相关问题