InvalidCastException при приведении от дочернего к родительскому - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь привести дочерний класс к его родителю, но получаю 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 голосов
/ 14 февраля 2019

Ваш IRepository<> интерфейс должен быть ковариантным , через out в его общем объявлении:

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

Если добавление out к общей подписи вызывает другие ошибки компилятораПохоже, что ваш актерский состав действительно недействителен.Например, вы говорите , что репо может обрабатывать ICleanableEntity объекты, но если кто-то вызовет repo.Add(new Foo()) на вашем RepositoryMock<Telemetry>, а Foo - это не Telemetry, чего бы вы ожидали?произойти?

В этом случае вам может понадобиться разделить ковариантные части вашего интерфейса IRepository<> на отдельный интерфейс, который вы можете использовать в ситуациях, когда вы действительно просто хотите использовать эти методы без необходимостивызывать методы типа .Add().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...