2009-09-11 6 views
1

J'écris une interface et je souhaite déclarer une propriété qui renvoie une collection générique. Les éléments de la collection doivent implémenter une interface. Est-ce possible et, si oui, quelle est la syntaxe?Ajout de contraintes à une propriété d'interface

Cela ne compile pas, quelle est la bonne façon de le faire?

interface IHouse 
{ 
    IEnumerable<T> Bedrooms { get; } where T : IRoom 
} 

Merci

Répondre

9

Vous devez marquer l'interface comme générique ainsi:

interface IHouse<T> where T : IRoom 
{ 
    IEnumerable<T> Bedrooms { get; } 
} 
+0

iHouse : où T: Iroom ou iHouse où T est juste? – anishMarokey

+0

@anishmarokey: Oui, corrigé le code. –

12

Pourquoi les génériques d'usage? Faites juste:

interface IHouse 
{ 
    IEnumerable<IRoom> Bedrooms { get; } 
} 

Ceci est plus propre, et puisque vous êtes déjà limité à l'interface, il agira presque de manière identique.

+0

Notez, cependant, que sans support de variance cela empêcherait une classe d'implémentation de renvoyer une 'List ' pour un type concret 'Room' comme valeur de la propriété. – kvb

1

Générique est pour les classes et les méthodes, pas les propriétés. Si une classe/interface est générique, vous pouvez utiliser le type dans la propriété. Je suis d'accord avec la solution de Reed.

+0

Vous vous demandez pourquoi j'ai été rejeté. Cette instruction provient directement de MSDN. –

+0

+1 - et pas seulement pour être d'accord avec moi;) Les contraintes génériques ne fonctionnent pas sur les propriétés, pour une raison. –

+0

@ReedCopsey Je voudrais entendre ce que cette raison est, sachant que les propriétés sont résolues à des méthodes de toute façon. – Marco

2

Il n'y a pas de bonnes raisons pour lesquelles Microsoft a choisi d'ajouter cette restriction. Sous le capot, les propriétés ne sont qu'une paire de méthodes, et les méthodes génériques sont déjà supportées.

Je frappé cette restriction deux ou trois fois, et a dû recourir à l'ajout explicite méthodes get et set à la place:

interface IHouse 
{ 
    IEnumerable<T> GetBedrooms<T>() where T : IRoom; 
} 
Questions connexes