33 votes

Contrats de code: Comment puis-je fournir une classe de contrat pour une interface générique?

Je voudrais spécifier un contrat pour cette interface générique, en utilisant des contrats de code:

 interface IRandomWriteAccessible<T>
{
    T this[uint index] { set; }
    uint Length { get; }
}
 

La documentation dit d'utiliser l'attribut ContractClass lors de la spécification d'un contrat pour une interface. Cependant, le compilateur se plaindra à ce sujet:

 [ContractClass(typeof(IRandomWriteAccessibleContract<T>))]
//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^     <-- compiler error
interface IRandomWriteAccessible<T> { … }

[ContractClassFor(typeof(IRandomWriteAccessible<T>))]
//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^          <-- compiler error
sealed class IRandomWriteAccessibleContract<T> : IRandomWriteAccessible<T> { … }
 

Il semble que les paramètres de type ne peuvent pas être utilisés avec des attributs.

Comment puis-je écrire un contrat pour mon interface générique? Ou n'est-ce pas possible avec les contrats de code?

45voto

Steve Guidi Points 8831

Comme mentionné par d'autres commentaires dans cette question, vous devez supprimer l'identificateur de type générique de votre utilisation d'attribut car il ne peut pas être résolu au moment de la compilation:

 [ContractClass(typeof(IRandomWriteAccessibleContract<>))] 
 

1voto

John Gietzen Points 23645

Bonne question, mais vous pouvez voir les raisons techniques derrière cette limitation, non?

La raison pour laquelle vous ne pouvez pas spécifier ContractClass est parce que Blah<T> n'est pas une classe.

Si vous pouvez créer une interface pour une classe concrète en spécifiant une valeur pour T , même si je suis sûr que cela est sous-optimal.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X