我有如下逆变接口及其实现
public interface IMessageSender<in TMessage>
{
Task SendAsync(TMessage @object);
}
public class MessageSender<TMessage> : IMessageSender<TMessage>
{
public Task SendAsync(TMessage @object)
{
throw new NotImplementedException();
}
}
我有应该表示TMessage的类的层次结构。
public class Base { }
public class Descendant1 : Base { }
public class Descendant2 : Base { }
为简单起见,我有两个发送方
var descendant1Sender = new MessageSender<Descendant1>();
var descendant2Sender = new MessageSender<Descendant2>();
我如何将这两个发送方强制转换为公共接口,以传递给方法,例如。
static void SomeMethod( IServiceBusMessageSender<Base> baseSender)
{
baseSender.SendAsync(new Descendant1());
}
SomeMethod(descendant1Sender); //This won't compile because of contravariance
1条答案
按热度按时间lb3vh1jj1#
不能将
IMessageSender<Descendant1>
视为IMessageSender<Base>
,因为它不是1,无论是否逆变,它要求参数是Descendant1
或Descendant1
的后代。Contravariance允许使用
IMessageSender<Base>
作为IMessageSender<Descendant1>
,而不是相反。也就是说,下面的代码将起作用(如果您使接口不变,将导致编译错误):Demo
统一采购司
作为解决方法,您可以考虑引入接口的非泛型版本和/或一些类型检查:
其思想是
SomeMethod
将检查处理程序是否可以发送消息。