web-dev-qa-db-fra.com

L'appel est ambigu entre les méthodes suivantes: Identical.NameSpace.InitializeComponent () et Identical.NameSpace.InitializeComponent ()

Ok, je suppose que cela pourrait être une affaire de Visual Studio, mais il doit y avoir une raison à cela. J'ai créé à partir de la liste des éléments par défaut un ListBox (clic droit sur un projet ou un dossier dans le projet -> Ajouter -> Nouvel élément -> Xaml ListBox). Immédiatement, je reçois une ligne ondulée rouge avec l'erreur: 

"Erreur 2 L'appel est ambigu entre les méthodes ou les propriétés suivantes:" Identical.NameSpace.ListBox1.InitializeComponent () "et " Identical.NameSpace.ListBox1.InitializeComponent () "C:\Documents et Paramètres\ouflak\Mes documents\Visual Studio 2010\Projets\Identique\NomEspace\ListBox1.xaml.cs 27 "

Tout le code en question est généré automatiquement et la raison de l'erreur est due à un conflit entre deux fichiers générés automatiquement: ListBox1.g.cs et ListBox1.designer.cs où public void InitializeComponent () est déclaré dans les deux. Naturellement, le code ne peut pas être compilé dans ces circonstances. Il est assez simple de simplement supprimer le ListBox1.designer.cs et de passer à autre chose, je suppose. Mais ma question: Pourquoi ce code est-il généré automatiquement avec cette erreur? Je m'attendrais à ce que tout ce qui est généré automatiquement puisse construire et compiler sans avoir à toucher au projet ou à du code. C'est le cas pour à peu près tous les autres éléments de liste de tâches que vous pouvez ajouter. Alors, pourquoi générer ce code avec l'erreur intégrée? Sommes-nous censés trouver un moyen de faire ce travail? Ce code est-il simplement une suggestion et il appartient à l'utilisateur/développeur IDE de préciser les détails?

Voici le code généré: ListBox1.xaml:

< ?xml version="1.0" encoding="utf-8" ? > 
< ListBox
    xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
    xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
    xmlns:xc="http://ns.neurospeech.com/xaml"
    xmlns:sys="clr-namespace:System;Assembly=mscorlib"
    x:Class="Identical.NameSpace.ListBox1"
    >
    <sys:String>Item 1</sys:String>
    <sys:String>Item 2</sys:String>
    <sys:String>Item 3</sys:String>
< /ListBox>

ListBox1.g.cs:

namespace Identical.Namespace
{
    /// <summary>
    /// ListBox1
    /// </summary>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
    public partial class ListBox1 : System.Windows.Controls.ListBox, System.Windows.Markup.IComponentConnector {

        private bool _contentLoaded;

        /// <summary>
        /// InitializeComponent
        /// </summary>
        [System.Diagnostics.DebuggerNonUserCodeAttribute()]
        public void InitializeComponent() {
            if (_contentLoaded) {
            return;
            }
            _contentLoaded = true;
            System.Uri resourceLocater = new System.Uri("/MyProject;component/namespace/listbox1.xaml", System.UriKind.Relative);

            #line 1 "..\..\..\namespace\ListBox1.xaml"
            System.Windows.Application.LoadComponent(this, resourceLocater);

            #line default
            #line hidden
        }

        [System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
        [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")]
        [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]
        [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")]
        void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target)     {
        this._contentLoaded = true;
        }
    }
}

ListBox1.designer.cs:

namespace Identical.NameSpace
{
    using System;

    public partial class ListBox1 : System.Windows.Controls.ListBox
    {
        private void InitializeComponent()
        {
            // Pre Statements...
            string string1 = "Item 1";
            string string2 = "Item 2";
            string string3 = "Item 3";
            // Statements...
            this.BeginInit();
            this.Items.Add(string1);
            this.Items.Add(string2);
            this.Items.Add(string3);
            this.EndInit();
            // Post Statements...
        }
    }
}

et enfin le ListBox1.xaml.cs (uniquement modifié pour empêcher la documentation XML et les avertissements Stylecop):

namespace Identical.NameSpace
{
    /// <summary>
    /// ListBox1 class
    /// </summary>
    public partial class ListBox1 : ListBox
    {
        /// <summary>
        /// Initializes a new instance of the ListBox1 class
        /// </summary>
        public ListBox1()
        {
            this.InitializeComponent();
        }
    }
}

C'est tout. Ceci est le code entièrement dans son état vierge généré automatiquement à l'exception des commentaires que j'ai mis dans le fichier xaml.cs.

J'ai un peu cherché sur ce site et sur Internet, mais personne ne semble avoir expliqué ce comportement. Je vais probablement simplement supprimer le code designer.cs et passer à autre chose. Mais si quelqu'un sait pourquoi c'est ici en premier lieu, ou s'il s'agit bien d'un bogue dans Visual Studio 2010 Professional, j'aimerais vraiment le savoir.

10
ouflak

Il semble que vous ayez déclaré la méthode InitializeComponent à deux endroits de votre classe, probablement un dans chaque classe partielle. Essayez de rechercher InitializeComponent dans tous les fichiers dans Visual Studio et je suppose que les résultats répertorieront deux emplacements où il est déclaré. Supprimez-en un et l'erreur disparaîtra.


MISE À JOUR >>>

Je ne suis pas sûr du type de réponse auquel vous vous attendez ici ... clairement, si vous n'avez pas ajouté l'une de ces définitions de méthode InitializeComponent, alors Visual Studio a un bogue. Je doute fort qu'il puisse y avoir une quelconque raison logique à cela, sauf que c'est un bug.

MISE À JOUR 2 >>>

J'ai jeté un œil sur le Microsoft Connect site Web à la recherche de bogues signalés comme celui-ci mais je n’en ai trouvé aucun ... J'ai laissé le lien ici si vous souhaitez le signaler.

12
Sheridan

J'ai eu ce problème lors de la copie de mon XAML entre les contrôles. Je viens juste de changer mon x: Class = "mynamespace" où mynamespace est l'espace de nommage approprié pour votre projet. Recompilé et tout est revenu à la normale.

9
Behr

Mon problème était le projet qui me donnait l'appel ambigu avait une référence à sa propre DLL. Cela provoquait la référence de la méthode à partir de la DLL ainsi que dans le projet réel. Une fois que j'ai supprimé la dll des références, l'erreur d'appel ambigu est partie.

3
huskytusky

Cela peut arriver si vous n'êtes pas alerte et prudent dans votre façon d'utiliser Resharper.

Cela m'est arrivé quand j'ai autorisé Resharper à importer automatiquement des références pendant le codage.

Donc, ayant mal saisi au début, puis modifié le code sur lequel je travaillais, je n'ai pas vérifié ce qu'il importait. Après avoir rencontré le même problème, je me suis rendu compte qu'il y avait une référence à soi dans la même bibliothèque. Il y avait donc une double implémentation de la méthode en question.

3
user919426

J'ai réussi à résoudre ce problème en regardant à l'intérieur du fichier .csproj avec un éditeur de texte et en cherchant le nom du fichier XSD de l'adaptateur de table. J'ai trouvé deux références à celle-ci, l'une avec un nom d'alias différent, ce qui explique pourquoi j'ai reçu ce message d'erreur.

1
Tahir Khalid

Les deux classes sont partielles, ce qui signifie qu'elles partagent des champs et des méthodes non privés.

Votre ListBox1 a deux méthodes InitializeComponent (partagées). Changer l’espace de noms de ListBox1 résoudra cette erreur.

1
Jordy Langen

J'ai rencontré ce problème, avec un contrôle utilisateur et un style associé. Je pense que j’avais essayé d’intégrer une certaine logique dans la classe de style, mais cela n’a pas fonctionné. Je l’ai donc annulée, mais apparemment, quelque chose a été oublié.

Elle se plaignait également de la variable _contentLoaded. J'ai donc essayé de supprimer celle qui était présente, et l'erreur a disparu et n'a pas été remplacée par une autre erreur. J'ai ensuite appuyé sur F12 pour aller à la définition de _contentLoaded et j'ai découvert qu'il se trouvait dans le fichier * .g de la classe de style. Bien que le fichier ait été nommé d'après le style, la classe interne a été nommée d'après le contrôle utilisateur.

J'ai supprimé les dossiers bin et obj pour le résoudre.

1
Chris

Je pense que InitializeComponent () est déclaré à deux endroits différents dans la même classe.

Essayez de trouver les deux définitions de classe à l'aide de CTR + F, puis résolvez l'ambiguïté. 

1
Hozefa Laxmidhar

Je viens d'avoir et résolu cette chose exacte ..

Cela s'est produit à un moment donné pendant ou après que j'ai dupliqué un formulaire dans un programme WinForms, puis que je l'ai renommé blah_Copy.

Le fichier cs principal et le fichier cs du concepteur sont tous deux des classes partielles. Ainsi, si une méthode est définie dans les deux méthodes et qu'elle a le même nom et les mêmes paramètres (ou le même nom et les mêmes paramètres),/même signature, elle se heurte.

Dans mon cas, les deux définitions Initialize () {..}, avaient un corps identique, aussi j'en ai simplement retiré une.

Supposons également que la méthode est Initialize () (c'était dans mon cas). Si vous vous appelez lui-même, appuyez sur F12 pour accéder à l’une des définitions (ou même au moins une).

1
barlop