2010-10-29 11 views
0

permet de dire que j'ai une classe qui implémente une interface générique interface publique iItem {}Une fonction mise en œuvre de l'interface générique et non générique

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(); } 
    } 
} 

J'ai aussi une interface non générique

public interface IFavoriteItem 
{ 
    IItem FavoriteItem { get; } 
} 

Je voudrais que la classe MyStuff implémente cette interface IFavoriteItem. Puisque TItem implémente IItem il me semble que la propriété public TItem FavoriteItem est déjà en train d'implémenter IFavoriteItem.

Mais le compilateur ne le pense pas, et il veut que je déclare un IItem IFavoriteItem.FavoriteItem distinct dans MyClass. Pourquoi est-ce vrai? Est-ce que C# covariance n'est pas la chose qui devrait jouer ici et résoudre mon problème?

Merci

Répondre

3

La raison est que FavoriteItem de IFavoriteItem ne peut pas être IItem, où le IFavoriteItem, il doit être un IItem. La seule façon de résoudre ce problème est par:

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

Ce sera tout simplement raccourci l'appel à votre mise en œuvre TItem.

Un bon exemple de l'endroit où cela est souvent utilisé est avec l'implémentation de IEnumerable<>. Ceux-ci ressemblent souvent à ceci:

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

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

Comment ça peut ne pas être 'IItem', si j'ai explicitement spécifié' où TItem: IItem'? – Shaddix

+0

Parce qu'il peut être une interface héritée de, ou une implémentation 'class' de' IItem'. Le 'where' ne spécifie pas qu'il doit être ** exactement **' IItem', mais à la place il doit être 'typeof (IItem) .IsAssignableFrom()'. Cependant, votre 'IFavoriteItem' a le type' IItem' exact spécifié. –

+0

Je comprends, merci. – Shaddix