假设我有一个实现通用接口的类 public interface IItem {}
public interface IStuff<out TItem> where TItem : IItem
{
TItem FavoriteItem { get; }
}
public class MyStuff<TItem> : IStuff<TItem> where TItem : IItem
{
public TItem FavoriteItem
{
get { throw new NotImplementedException(); }
}
}
我还有一个非通用接口
public interface IFavoriteItem
{
IItem FavoriteItem { get; }
}
我想让MyStuff类实现这个IFavoriteItem接口。由于TItem实现了IItem,对我来说,public TItem FavoriteItem
属性已经实现了IFavoriteItem。
但编译器不这么认为,它要我在MyClass中声明一个单独的IItem IFavoriteItem.FavoriteItem
。为什么会这样? c#covariance不应该在这里发挥作用并解决我的问题吗?
由于
答案 0 :(得分:3)
原因是FavoriteItem
的{{1}}可能 IFavoriteItem
,IItem
上的是IFavoriteItem
。解决这个问题的唯一方法是:
IItem
这只会简化对IItem IFavoriteItem.FavoriteItem
{
get { return FavoriteItem; }
}
实施的调用。
经常使用它的一个很好的例子是TItem
的实现。这些通常看起来像这样:
IEnumerable<>