2009-03-03 12 views
1

Ich bin vor ein paar Tagen in einer unserer C# -Anwendungen bei der Arbeit auf den folgenden Fehler gestoßen. Hier ist, wie die Fehlermeldung wie folgt aussieht:seltsame C# -Compilerfehler: zyklische Vererbung

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

Diese immer auf meiner Maschine passiert, aber auf der Build-Maschine gibt es eine 50-50 Chance die Build erfolgreich sein wird. Meine Klasse "ResourceManager" implementiert eine Schnittstelle "IResourcesManagerView", die auch mehrere Schnittstellen implementiert, von denen eine eine generische Schnittstelle namens IInitializable ist. Ich habe die folgende Problemumgehung gefunden: Deklarieren Sie eine Dummy-Schnittstellen-ID, die IInitializable implementiert.

Aber das ergibt keinen Sinn für mich. Ist jemand auf dieses Problem gestoßen? Ich verwende Windows XP, Visual Studio 2005.

+0

Sie sollten IInitializable zu kürzen, es ist immer noch produziert den Fehler und post den Code neu erstellt werden. – Samuel

+0

Das klingt wie ein Fehler im Compiler. Joel, wenn das immer noch ein Problem in Ihrer Codebasis ist, können Sie bitte versuchen, ein kleines eigenständiges Projekt zu erstellen, das gerade genug Code hat, um dieses Problem zu reproduzieren und unter http://connect.microsoft.com/ einen Fehler zu melden? Sie können Visual Studio 2010 auch versuchen, als wäre dies ein Fehler, der möglicherweise bereits behoben wurde. –

Antwort

1

1) Fügen Sie ein Klassendiagramm hinzu, um das Problem zu visualisieren. Etwas sagt mir, dass du jetzt keins verwendest.

2) Minimieren Sie das Problem auf etwas, das Sie posten können. Aber Sie werden es wahrscheinlich selbst auf dem Weg finden.

Beste Rate: Riecht wie es gibt 2 Versionen von IInitializable oder vielleicht IResourcesManagerView herum.

+0

Mein Objekt implementiert zwei Methoden mit dem Namen IInitializable, aber einer ist generisch. Außerdem haben sie beide eine Methode "void Deinit()", die in der Klasse durch eine öffentliche Methode implementiert wird (implizite Implementierung). Ich werde mir auch das Klassendiagramm ansehen. –

1

Sie verweisen wahrscheinlich auf dieselbe, aber unterschiedliche Version Assembly, die die Schnittstelle enthält. Stellen Sie sicher, dass Sie auf allgemeine Assemblys vom selben Speicherort verweisen.

+0

Es ist unwahrscheinlich, dass dies passiert. Es erklärt auch nicht, warum das Hinzufügen der ID das Problem löst. –

+0

Sorry ich habe diesen Teil verpasst :) – leppie

0

Ich bekomme den gleichen Kompilierungsfehler, reparierte es (Art von) und formalisierte es here. Aber es könnte ein anderes Problem sein als Ihres.