【发布时间】:2014-10-09 12:26:22
【问题描述】:
我试图了解为什么在这种情况下投射不起作用。
假设以下接口:
public interface IDomainEvent { }
public interface IHandler<T> where T: IDomainEvent
{
void Handle(T args);
}
还有这些简单的实现:
public class SomeEvent : IDomainEvent
{
public string Value { get; set; }
}
public class SomeEventHandler : IHandler<SomeEvent>
{
public void Handle(SomeEvent args) { }
}
我不明白为什么我不能做这个演员:
var handler = new SomeEventHandler() as IHandler<IDomainEvent>;
我正在使用 Autofac 来解析基于事件的处理程序列表,这很好,但它当然会完全具体地创建它们,在运行时我需要通过接口处理它们。我可以很容易地使用反射来调用句柄方法,但看起来这应该可以工作:/
【问题讨论】:
-
尝试在界面声明中将 T 标记为
out。这看起来像是一个协方差问题。 -
是的,试试谷歌搜索
covariance和contravariance。 -
@BradleyDotNET 那么接口定义将无法编译。它是一个内在的逆变 API。
-
@BradleyDotNET 不应该是
in吗? -
@TimothyShields 是的,该接口在概念上是逆变的,而不是协变的,但随后他试图在协变庄园中使用它,因此即使进行了更改,使用 sill 也不起作用。
标签: c# generics interface casting