【问题标题】:One function implementing Generic and non-generic interface一个实现通用和非通用接口的函数
【发布时间】:2010-10-29 07:05:14
【问题描述】:

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

谢谢

【问题讨论】:

    标签: c# generics interface


    【解决方案1】:

    原因是IFavoriteItem 中的FavoriteItem 可能不是 IItem,而在IFavoriteItem 上,它必须 是@987654326 @。解决这个问题的唯一方法是:

    IItem IFavoriteItem.FavoriteItem
    {
        get { return FavoriteItem; }
    }
    

    这将简单地调用您的TItem 实现。

    经常使用此功能的一个很好的例子是IEnumerable&lt;&gt; 的实现。这些通常看起来像这样:

    public class MyEnumerable : IEnumerable<T>
    {
        public IEnumerator<T> GetEnumerator()
        {
            throw new NotImplementedException();
        }
    
        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
    }
    

    【讨论】:

    • 如果我明确指定where TItem : IItem,它怎么可能不是IItem
    • 因为它可以是继承的接口,也可以是classIItem 实现。 where 没有指定它必须是完全 IItem,而是它必须是typeof(IItem).IsAssignableFrom()。但是,您的 IFavoriteItem 具有指定的确切 IItem 类型。
    • 不确定这是否相关,但是为什么List同时实现了IList和IList,而不必实现Add(object item),它只实现了Add (T项目)?
    • 没关系,找到答案了:stackoverflow.com/questions/4388782/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    • 2019-12-20
    • 2019-05-27
    • 2017-06-20
    相关资源
    最近更新 更多