gpt4 book ai didi

c# - 奇怪的通用约束问题

转载 作者:行者123 更新时间:2023-11-30 21:05:07 24 4
gpt4 key购买 nike

为什么这行不通?!

    public interface IBus
    {
        void Subscribe<T>(ISubscribe<T> subscriber) where T : class, IEvent;
        void Send<T>(IEvent @event) where T : class, IEvent;
    }

class InMemoryEventBus : IBus
    {
        private readonly IDictionary<ISubscribe<IEvent>, Type> _subscribers;

        public InMemoryEventBus()
        {
            _subscribers= new Dictionary<ISubscribe<IEvent>, Type>();
        }

        public void Subscribe<T>(ISubscribe<T> subscriber) where T : class, IEvent
        {
            _subscribers.Add(subscriber, typeof(T));
        }

        public void Send<T>(IEvent @event) where T : class, IEvent
        {
            foreach (var subscriber in _subscribers.Where(subscriber => subscriber.Value == typeof(T)))
            {
                subscriber.Key.Handle(@event);
            }
        }
    }

    public interface IEvent
    {
        Guid EventId { get; set; }
    }

public interface ISubscribe<T> where T : IEvent
    {
        void Handle(T @event);
    }

    public class StockLevelDroppedBellowMinimumLevelEvent : IEvent
    {
        public Guid EventId { get; set; }

        public string Message { get; set; }
    }

我得到:

cannot convert from 'IHandle<T>' to 'IHandle<IEvent>'

最佳答案

编辑:实际上是 ISubscribe这需要是协变的 - 但现在我们可以看到 ISubscribe 的声明,你不能让它协变——只能是逆变。

一般来说,类型不是通用的变体。例如,ICollection<string>不是 ICollection<object> - 这是一件好事,否则会编译:

ICollection<string> strings = new List<string>();
ICollection<object> objects = strings; // Fortunately this isn't valid
objects.Add(new Button()); // This should be fine of course...
string x = strings[0]; // But what would this do?!

在您的情况下,我相信您需要更改字典 - 您将能够保证 ISubscribe 的“正确”类型在每种情况下都使用。但是,您正在以一种非常奇怪的方式使用字典 - 您应该反转键和值类型,如下所示:

class InMemoryEventBus : IBus
{
private readonly IDictionary<Type, object> _subscribers;

public InMemoryEventBus()
{
_subscribers = new Dictionary<Type, object>();
}

public void Subscribe<T>(ISubscribe<T> subscriber) where T : IEvent
{
_subscribers.Add(typeof(T), subscriber);
}

public void Send<T>(IEvent @event) where T : class, IEvent
{
object value;
if (_subscribers.TryGetValue(typeof(T), out value))
{
ISubscriber<T> subscriber = (ISubscriber<T>) value;
subscriber.Handle(@event);
}
}
}

关于c# - 奇怪的通用约束问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11887995/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com