你的 IFoo 接口在这种用法中似乎是错误的,它应该是:
public interface IFoo<out T, **out** U>
With U
外出。请记住,一个out
泛型类型参数意味着它可以“向外”变化。也就是说,您可以隐式地将类型扩展为更宽的类型。In
不过,这意味着您可以隐式地将类型“向内”缩小为更具体的类型。当然,这些只是粗略的类比。
所以在分配的情况下hmm
,您正在隐式地尝试扩大接口泛型类型参数U
from Derived
to Base
,但接口声明它正在缩小(in
):
IFoo<IShape, Base> hmm = new MyFoo();
所以它不能进行隐式转换。如果您确实希望能够隐式扩展此接口,则第二个类型参数应该是out
代替in
.
更新:在您发表评论后,我发现最大的困境是您希望它既可以输入又可以输出,这实际上是不可能的,因为它是逆变输入,所以您不能将接口协变分配给IFoo<IShape, Base>
, 很遗憾。
您要么需要围绕无法分配给的事实进行编码IFoo<IShape,Base>
或者你可以做的是将 Foo 创建为:
public class MyFoo : IFoo<Rectangle, Base>
然后投射到Rectangle
内部实施。最主要的是,同一类型参数不能同时具有协变和逆变。
这有道理吗?