C#向下转换泛型类型

时间:2018-04-23 16:35:54

标签: c# inheritance generic-programming downcast generic-type-argument

interface IMyEvent { }

class SpecificEvent : IMyEvent {  }

interface IMySubscriber<TEvent> where TEvent : IMyEvent { }

class MySubscriber<TEvent> : IMySubscriber<TEvent> where TEvent: IMyEvent { }

class EventPublisher
{
    public void Subscribe(IMySubscriber<IMyEvent> subscriber)
    {

    }
}

我无法理解为什么用MySubscriber<SpecificEvent>对象执行Subscribe方法是不可能的。

new EventPublisher().Subscribe(new MySubscriber<SpecificEvent>());

它表示无法将MySubscriber<SpecificEvent>投射到IMySubscriber<IMyEvent>。你能解释它为什么会发生,或提供一些链接,我可以阅读它。

1 个答案:

答案 0 :(得分:2)

为此,您必须使用out通用参数标记界面:

interface IMySubscriber<out TEvent> where TEvent : IMyEvent { }

http://rextester.com/FAXW57974

请参阅:still confused about covariance and contravariance & in/out