Преобразование конкретного потомка в родителя, который имеет общую специализацию в C # - PullRequest
0 голосов
/ 27 мая 2018

У меня есть простой код:

public interface IEvent {}

public class ObjectClickEvent : IEvent {        
    public Object Object;
    public ObjectClickEvent(Object object) {
        Object = object;
    }
}

public abstract class EventReceiver<T> where T : IEvent {
    protected readonly Controller Controller;
    protected EventReceiver(Controller controller) {
        Controller = controller;
    }

    public abstract void ReceiveEvent(T @event);
}

public class ObjectClickEventReceiver : EventReceiver<ObjectClickEvent> {
    public ObjectClickEventReceiver(Controller controller) : base(controller) {
    }
    public override void ReceiveEvent(ObjectClickEvent @event) {
    }
}

Затем я хочу инициализировать все мои приемники внутри контроллера

   var receivers = new List<EventReceiver<IEvent>>();
   var receiver = new LetterClickEventReceiver(this);
   receivers.Add(receiver);

Но получена ошибка компиляции:

Argument type 'LetterClickEventReceiver' is not assignable to parameter type
'ScriptsV2.Core.Controller.EventReceivers.EventReceiver<IEvent>'

Вопрос в том, почему это происходит, если я утверждаю, что мой конкретный получатель расширяет EventReceiver ?Почему дочерний объект нельзя добавить в список родительских объектов?

1 Ответ

0 голосов
/ 27 мая 2018

A<Derived> можно сделать совместимым с A<Base>, сделав параметр типа базового интерфейса ковариантным.Ключевое слово out делает это.

public interface EventReceiver<out T> where T : IEvent {...}

Затем обновите свои коллекции, чтобы использовать эти интерфейсы вместо ссылки на класс.

Дисперсия: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/covariance-contravariance/

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