一个实现通用和非通用接口的功能

时间:2010-10-29 07:05:14

标签: c# generics interface

假设我有一个实现通用接口的类     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不应该在这里发挥作用并解决我的问题吗?

由于

1 个答案:

答案 0 :(得分:3)

原因是FavoriteItem的{​​{1}}可能 IFavoriteItemIItem上的IFavoriteItem。解决这个问题的唯一方法是:

IItem

这只会简化对IItem IFavoriteItem.FavoriteItem { get { return FavoriteItem; } } 实施的调用。

经常使用它的一个很好的例子是TItem的实现。这些通常看起来像这样:

IEnumerable<>