2010-10-29 68 views
0

可以说我有一个类,它实现了一个通用接口 公共接口的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#协方差不是应该在这里玩的东西,解决我的问题吗?

感谢

回答

3

这样做的原因是,IFavoriteItemFavoriteItem可能不IItem,其中在IFavoriteItem,它必须IItem。解决这个问题的唯一方法是:

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

这将只是快捷方式调用您的TItem实现。

一个很好的例子就是在这个地方经常使用的是IEnumerable<>的实现。这些通常是这样的:

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

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 
} 
+0

如果我明确指定'Where TItem:IItem',它可能不是'IItem'? – Shaddix 2010-10-29 07:34:12

+0

因为它可以是'IItem'的继承接口,或'class'实现。 'where'没有指定它必须**完全**'IItem',而是它必须是'typeof(IItem).IsAssignableFrom()'。但是,您的'IFavoriteItem'具有指定的确切'IItem'类型。 – 2010-10-29 07:36:56

+0

我明白了,谢谢。 – Shaddix 2010-10-29 08:00:34