2010-03-11 6 views

Répondre

2

Pourriez-vous définir votre lieu type que:

public interface Y<A> : X<A,A> 
{ 
} 
6

La première raison qui vient à l'esprit est la suivante. Dans ce cas, le type Y implémente deux fois la même interface mais peut avoir des implémentations différentes de la même méthode. Cela crée une ambiguïté insoluble dans le compilateur pour la méthode Tx dans l'implémentation et l'appel.

Par exemple, prenez le problème suivant.

class OtherExample<A,B> : Y<A,B> { 
    B Tx(A x) { 
    Console.WriteLine("Top method in the file"); 
    return default(B); 
    } 
    A Tx(B x) { 
    Console.WriteLine("Bottom method in the file"); 
    return default(A); 
    } 
} 

Si vous ignorez l'erreur d'unification c'est une mise en œuvre juridique de Y<A,B>. Maintenant, imaginez que l'utilisateur ne suit

var v1 = new OtherExample<int,int>(); 
v1.Tx(42); 

Que se passerait-il exactement dans ce scénario? Comment le compilateur, ou le CLR d'ailleurs, pourrait-il résoudre l'ambiguïté? Vous auriez des méthodes nommées de manière identique avec des signatures identiques.

+0

Une erreur de compilation simple ferait l'affaire. –

+0

- La philosophie étant que si vous faites une instanciation non-sensuelle vous l'avez demandée mais cela vaut mieux que d'interdire un motif utile. C'est-à-dire: ne jetez pas l'outil juste parce qu'il peut être abusé: l'abus peut être vérifié statiquement et refusé. –

Questions connexes