从孩子到父母时,无效的castection



我正在尝试向其父母投入一个子类,但是我得到了无效的castexception。我的代码如下:

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

以前的代码编译,但会引发无效的castException。

我在C#中不是很有经验,我来自一个可能的Java世界,但是我检查了C#的文档,并指出可以通过差异来完成。谁能给我一个暗示为什么我不能从子班来到父母?

您的IRepository<>接口需要通过out在其通用声明中进行协变:

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

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

在这种情况下,您可能需要考虑将IRepository<>接口的协变部分分隔为单独的接口,您可以在您确实只想使用这些方法而无需调用.Add()等方法的情况下使用它们。

相关内容

最新更新