2009-03-03 11 views
1

Je suis tombé sur l'erreur suivante il y a quelques jours, dans l'une de nos applications C# ici au travail. Voici comment le message d'erreur ressemble:bizarre erreur de compilation C#: héritage cyclique

"Inherited interface '...ResourceManager.ResourcesManager' causes a cycle in the interface hierarchy of '...ResourceManager.IResourcesManagerView' in D:...\Common\ResourceManager\IResourcesManagerView.cs"

Cela se produit toujours sur ma machine, mais sur la machine de construction il y a une chance de 50-50 la construction réussira. Ma classe 'ResourceManager' implémente une interface 'IResourcesManagerView', qui implémente également plusieurs interfaces, dont une interface générique nommée IInitializable. J'ai trouvé la solution de contournement suivante: déclarer une interface factice IDummy implémentant IInitializable.

Mais cela n'a aucun sens pour moi. Quelqu'un a-t-il rencontré ce problème? J'utilise Windows XP, Visual Studio 2005.

+0

Vous devez raccourcir IInitializable pour qu'il produise toujours le bogue et afficher le code requis pour le recréer. – Samuel

+0

Cela ressemble à un bug dans le compilateur. Joel, si c'est toujours un problème dans votre base de code, pourriez-vous essayer de créer un petit projet autonome qui a juste assez de code pour reproduire ce problème et déposer un bug sur http://connect.microsoft.com/? Vous pouvez également essayer Visual Studio 2010 comme s'il s'agissait d'un bug déjà résolu. –

Répondre

1

1) Ajoutez un diagramme de classes pour visualiser le problème. Quelque chose me dit que vous n'en utilisez pas un maintenant.

2) Réduire le problème à quelque chose que vous pouvez poster. Mais vous le trouverez probablement vous-même le long du chemin.

Best Guess: On dirait qu'il existe 2 versions de IInitializable ou peut-être IResourcesManagerView.

+0

Mon objet implémente deux méthodes nommées identiques IInitializable, mais l'une est générique. En outre, ils ont tous deux une méthode "void Deinit()", qui est implémentée dans la classe par une méthode publique (implémentation implicite). Je vais jeter un coup d'oeil au diagramme de classe aussi. –

1

Vous faites probablement référence à la même version, mais à un ensemble de versions différent contenant l'interface. Assurez-vous de référencer les assemblages courants à partir du même emplacement.

+0

Il est peu probable que cela arrive. En outre, cela n'explique pas pourquoi l'ajout de l'IDummy résout le problème. –

+0

Désolé j'ai raté cette partie :) – leppie

0

J'ai reçu la même erreur de compilation, je l'ai corrigé (en quelque sorte) et je l'ai formalisé here. Mais ce pourrait être un problème différent du vôtre.