2010-10-29 63 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