C# Как использовать универсальный тип параметра как «вложенный» тип для интерфейса?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 C# Как использовать универсальный тип параметра как «вложенный» тип для интерфейса?

Сообщение Anonymous »

Я просто решал некоторые задачи для своего ума и столкнулся с непониманием некоторых основных понятий. Этот код

Код: Выделить всё

namespace Game {

public static class EventSystem {

public class EventBase { }

public interface IEventListener where TEvent : EventBase {
void OnEvent(TEvent ev);
}

private static Dictionary _subscriptions = new();

public static void AddListener(IEventListener listener) where TEvent : EventBase {

if (!_subscriptions.ContainsKey(typeof(TEvent))) {
_subscriptions.Add(typeof(TEvent), new());
}
var list = _subscriptions[typeof(TEvent)];
list.Add(listener);
}

public static void RemoveListener(IEventListener listener) where TEvent : EventBase {
if (_subscriptions.ContainsKey(typeof(TEvent))) {
var list = _subscriptions[typeof(TEvent)];
list.Remove(listener);
}
}
выдает следующие ошибки в строках со list.Add(listener) и list.Remove(listener):

Код: Выделить всё

> Argument 1: cannot convert from
> 'Game.EventSystem.IEventListener' to
> 'Game.EventSystem.IEventListener'CS1503
Я пытаюсь понять, почему и как это исправить.
Cast (

Код: Выделить всё

list.Add((IEventListener)listener);
) выдает мне исключение во время выполнения: System.InvalidCastException: указанное приведение недопустимо.
Итак, если я правильно понимаю, IEventListener инвариантен к EventBase, хотя событие TEvent на самом деле является EventBase. Чего я не понимаю, так это "почему"?
PS. Я в курсе возможных утечек памяти, не будем это обсуждать) - просто хочу понять, что не так с параметрами обобщенного типа

Подробнее здесь: https://stackoverflow.com/questions/783 ... -interface
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как использовать универсальный тип в качестве параметра метода
    Anonymous » » в форуме C#
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Как использовать универсальный тип в качестве параметра метода
    Anonymous » » в форуме C#
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Как использовать универсальный тип в качестве параметра метода
    Anonymous » » в форуме C#
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Как преобразовать универсальный класс в универсальный класс объекта?
    Anonymous » » в форуме C#
    0 Ответы
    53 Просмотры
    Последнее сообщение Anonymous
  • Как ограничить универсальный тип типом внутри типа параметра
    Anonymous » » в форуме Python
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»