Ok, ich vermute, dass es sich um eine Visual Studio-Sache handelt, aber es muss einen Grund dafür geben. Ich erstellte aus der Liste der Standardelemente eine ListBox (Rechtsklick auf Projekt oder Ordner im Projekt - & gt; Hinzufügen - & gt; Neues Objekt - & gt; Xaml ListBox). Sofort bekomme ich eine rote Schnörkelzeile mit dem Fehler:
"Fehler 2 Der Aufruf ist nicht eindeutig zwischen den folgenden Methoden oder Eigenschaften: 'Identical.NameSpace.ListBox1.InitializeComponent ()' und 'Identical.NameSpace.ListBox1.InitializeComponent ()' C: \ Dokumente und Einstellungen \ ouflak \ Eigene Dateien \ Visual Studio 2010 \ Projects \ Identical \ NameSpace \ ListBox1.xaml.cs 27 "
Der gesamte betreffende Code wird automatisch generiert, und der Grund für den Fehler liegt in einem Konflikt zwischen zwei automatisch generierten Dateien: ListBox1.g.cs und ListBox1.designer.cs, wobei public void
InitializeComponent () ist in beiden erklärt. Natürlich kann der Code unter diesen Umständen nicht kompilieren. Es ist einfach genug, einfach die ListBox1.designer.cs zu löschen und weiterzugehen, nehme ich an. Aber meine Frage: Warum wird dieser Code automatisch mit diesem Fehler generiert? Ich würde erwarten, dass alles, was automatisch erzeugt wird, in der Lage ist, zu kompilieren und zu kompilieren, ohne das Projekt oder irgendeinen Code zu berühren. Für fast jeden anderen Toobox-Artikel, den Sie hinzufügen können, ist dies der Fall. Warum also diesen Code mit dem eingebauten Fehler erzeugen? Sollen wir einen Weg finden, das funktionieren zu lassen? Ist dieser Code nur ein Vorschlag und es liegt an dem IDE-Benutzer / -Entwickler, die Details auszuarbeiten?
Hier ist der generierte Code: ListBox1.xaml:
%Vor%ListBox1.g.cs:
%Vor%ListBox1.designer.cs:
%Vor%und schließlich die ListBox1.xaml.cs (nur geändert, um XML-Dokumentation und Stylecop-Warnungen zu verhindern):
%Vor%Das ist es. Dies ist der Code vollständig in seinem ursprünglichen automatisch generierten Zustand mit Ausnahme der Kommentare, die ich in die xaml.cs-Datei eingegeben habe.
Ich habe diese Seite und das Internet ein wenig durchsucht, aber anscheinend hat niemand dieses Verhalten erklärt. Ich werde wahrscheinlich nur den Designer.cs Code löschen und weitermachen. Aber wenn jemand weiß, warum das überhaupt hier ist, oder wenn es tatsächlich ein Bug in Visual Studio 2010 Professional ist, würde ich es gerne wissen.
Offenbar haben Sie die Methode InitializeComponent
an zwei Stellen in Ihrer Klasse deklariert, wahrscheinlich eine in jeder Teilklasse. Versuchen Sie, in Visual Studio in allen Dateien nach InitializeComponent
zu suchen, und ich vermute, dass die Ergebnisse zwei Orte auflisten werden, an denen sie deklariert werden. Löschen Sie einen und der Fehler verschwindet.
UPDATE & gt; & gt; & gt; & gt;
Ich bin mir nicht sicher, welche Art von Antwort Sie hier erwarten ... klar, wenn Sie keine dieser InitializeComponent
-Methodendefinitionen hinzugefügt haben, dann hat Visual Studio einen Fehler. Ich bezweifle sehr, dass es irgendeinen logischen Grund dafür geben kann, außer dass es ein Fehler ist.
UPDATE 2 & gt; & gt; & gt; & gt;
Ich habe auf der Microsoft Connect -Website nach bereits vorhandenen gemeldeten Fehlern gesucht, konnte aber keine finden ... Ich habe den Link hier verlassen, wenn Sie es ihnen melden möchten.
Mein Problem war, dass das Projekt, das mir den mehrdeutigen Anruf gab, einen Verweis auf seine eigene DLL hatte. Dies führte dazu, dass die Methode sowohl in der DLL als auch im aktuellen Projekt referenziert wurde. Sobald ich die DLL von den Verweisen entfernte, ging der mehrdeutige Anruffehler weg.
Kann passieren, wenn Sie nicht aufmerksam und vorsichtig sind, wie Sie Resharper verwenden.
Das ist mir passiert, als ich Resharper erlaubte, während der Programmierung automatisch Referenzen zu importieren.
Nachdem ich mich anfangs vertippt und dann den Code bearbeitet habe, an dem ich gerade gearbeitet habe, habe ich nicht überprüft, was er importiert hat. Nachdem ich auf dasselbe Problem gestoßen war, wurde mir klar, dass es in derselben Bibliothek eine Selbstreferenz gab. Also gab es doppelte Implementierungen der fraglichen Methode.
Beide Klassen sind partiell, dh sie teilen sich gegenseitig nicht private Felder & amp; Methoden.
Ihr ListBox1
hat zwei InitializeComponent
(shared) Methoden. Wenn Sie den Namespace von ListBox1
ändern, wird dieser Fehler behoben.
Ich denke, InitializeComponent () wird an zwei verschiedenen Orten in der gleichen Klasse deklariert.
Versuchen Sie beide Klassendefinitionen mit CTR + F zu finden und lösen Sie dann die Mehrdeutigkeit.
Ich bin auf dieses Problem gestoßen, mit einem Benutzersteuerelement und einem zugehörigen Stil. Ich glaube, ich hatte versucht, etwas Logik in die Stilklasse zu bringen, aber es hat nicht funktioniert, also habe ich es rückgängig gemacht, aber anscheinend wurde etwas zurückgelassen.
Es hat sich auch über die Variable _contentLoaded beschwert, also habe ich versucht, die eine zu löschen, die dort war, und der Fehler verschwand und wurde nicht durch einen anderen Fehler ersetzt. Ich habe dann F12 gedrückt, um zur Definition von _contentLoaded zu gehen und festgestellt, dass es in der * .g-Datei für die Stilklasse war. Obwohl die Datei nach dem Stil benannt wurde, wurde die interne Klasse nach dem Benutzersteuerelement benannt.
Ich habe die Ordner bin und obj gelöscht, um es zu lösen.
Ich habe es gelöst, indem ich in die .csproj-Datei mit einem Texteditor geschaut habe und nach dem Namen der XSD-Datei des Tabellenadapters gesucht habe. Ich habe zwei Referenzen gefunden, eine mit einem anderen Alias-Namen, weshalb ich diese Fehlermeldung bekommen habe.
Ich habe gerade genau dieses Problem gelöst und gelöst.
Es ist irgendwann während oder nach dem Duplizieren eines Formulars in einem WinForms-Programm passiert und dann in bla_Copy umbenannt worden.
Die Haupt-cs-Datei und die Designer-cs-Datei sind beide Teilklassen. Wenn also eine Methode in beiden definiert ist und denselben Namen und dieselben Parameter (oder denselben Namen und dieselben Parameter) hat, dann wird die gleiche Signatur zusammentreffen.
In meinem Fall hatten beide, beide Initialize () {..} Definitionen, identische Körper, also habe ich einfach einen entfernt.
Sagen wir auch, die Methode ist Initialize () (das war in meinem Fall). Wenn Sie sich selbst anrufen, dann drücken Sie F12, um zu einer (oder vielleicht sogar zu einer) der Definitionen zu gelangen.