2010-11-04 5 views
2

L'intention de ce qui suit est de permettre que l'appel IRegistration<Foo>.As<IFoo> si Foo implémente IFoo:paramètre de type Contraindre d'une méthode aux interfaces mises en œuvre par un autre type

interface IRegistration<TImplementation> 
{ 
    void As<TContract>() where TImplementation : TContract; 
} 

Ce n'est pas autorisé par le compilateur C# 3.0. Je reçois l'erreur suivante:

'SomeNamespace.IRegistration.As()' does not define type parameter 'TImplementation'

Existe-t-il un moyen de contourner cela, autre que de mettre les deux paramètres de type dans la déclaration de méthode? Cette question est inspiré par ce other question about Autofac.

Répondre

3

Vous essayez d'ajouter une contrainte sur un paramètre de type qui n'existe pas dans la liste de paramètres de type.

Est-ce ce que vous vouliez dire?

interface IRegistration<TImplementation> where TImplementation : TContract 
{ 
    void As<TContract>(); 
} 

Bien que cela ne compilera pas non plus - vous ne pouvez pas avoir de contrainte générique sur un type générique.

Cela compilera, mais produira probablement pas la contrainte que vous voulez sur la méthode elle-même:

interface IRegistration<TImplementation,TContract> where TImplementation : TContract 
{ 
    void As<TContract>(); 
} 

Voir si cela va faire:

interface IRegistration<TImplementation,TContract> where TImplementation : TContract 
{ 
    void As(); 
} 

De cette façon, chaque fois que vous utilisez TImplementation , il sera contraint à être un TContract et vous pouvez toujours utiliser TContract dans la méthode As.

Vous pouvez trouver plus d'informations here - regardez la section vers la fin de la page, intitulée "Type de paramètres comme contraintes".

+0

Hmm, ne pense pas que cela fonctionne - 'TContract' sur l'interface est différent de' TContract' sur la méthode. –

+0

@Tim Robinson - bon point. Je cherchais quelque chose qui va compiler et oublié les exigences ... Réponse mise à jour. – Oded

+0

D'accord avec votre réponse mise à jour - Je ne vois pas d'autre moyen de contourner cela. –

Questions connexes