这个调用在以下方法之间存在歧义:Identical.NameSpace.InitializeComponent()和Identical.NameSpace.InitializeComponent()。

14

好的,我怀疑这可能是一个 Visual Studio 的问题,但一定有原因。我从默认项列表中创建了一个 ListBox(右键单击项目或项目中的文件夹 -> 添加 -> 新项目 -> Xaml ListBox)。然后我立即得到了一个红色的波浪线错误:

"Error 2 The call is ambiguous between the following methods or properties: 'Identical.NameSpace.ListBox1.InitializeComponent()' and 'Identical.NameSpace.ListBox1.InitializeComponent()' C:\Documents and Settings\ouflak\My Documents\Visual Studio 2010\Projects\Identical\NameSpace\ListBox1.xaml.cs 27"

所有相关的代码都是自动生成的,错误的原因是由于两个自动生成的文件 ListBox1.g.cs 和 ListBox1.designer.cs 冲突,在其中都声明了 public void InitializeComponent()。在这种情况下,代码无法编译。删除 ListBox1.designer.cs 并继续工作就很简单。 但我的问题是:为什么这段代码会自动生成这个错误?我希望任何自动生成的东西都能够构建和编译而不需要修改项目或代码。对于几乎所有其他可以添加的工具箱项,情况都是如此。那么为什么要生成具有内置错误的代码?我们应该找到某种方法使其正常工作吗?这段代码只是一些建议,需要 IDE 用户/开发人员来处理细节吗?

这是生成的代码: 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...
        }
    }
}

最后是ListBox1.xaml.cs(仅修改以防止XML文档和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();
        }
    }
}

就是这样,这段代码完全是自动生成的,只有我在xaml.cs文件中添加的注释。

我搜索了这个网站和互联网一段时间,但似乎没有人解释这种行为。 我可能会删除designer.cs代码并继续前进。 但如果有人知道这首先为什么在这里,或者它是否确实是Visual Studio 2010专业版中的错误,我真的很想知道。


1
这是在一个单一的项目中吗?(即,其他相同的命名空间是否来自引用的程序集?) - Marc Gravell
1
为什么你在代码示例中移除了所有命名空间? - user1064248
1
看看这个能否帮到你:重建WPF项目时出现未知错误。检查一下是否意外地将.designer.cs文件包含在项目中。 - publicgk
1
好奇:如果您在解决方案资源管理器中右键单击 ListBox1.xaml 并单击“运行自定义工具”,错误是否仍然存在?看起来这至少应该重新生成 .g.cs 文件。https://dev59.com/gWLVa4cB1Zd3GeqPtiiz#9948546 无论如何,我知道问题仍然存在,为什么首先会生成这样的文件。 - Andrew
我还没有收到微软方面的任何回复。 - ouflak
显示剩余7条评论
13个回答

14

在将我的XAML从一个控件复制到另一个控件时,我遇到了这个问题。我只需要更改我的x:Class="mynamespace",其中mynamespace是你的项目的正确名称空间。重新编译后一切都恢复正常。


1
有趣。也许这会帮助到某个人。+1 - ouflak
2
另一个曾经让我困扰的问题是,当你从A类的XAML复制粘贴到B类的XAML时,忘记为B更改x:Class。编译错误可能会报告A类,这很令人困惑,因为A类的XAML或代码后台都没有问题,也没有任何迹象表明问题实际上出现在另一个类中。 - Mark Feldman

13

看起来你在类中声明了两次 InitializeComponent 方法,很可能是每个 partial class 中都有一个。在 Visual Studio 中搜索所有文件中的 InitializeComponent,我猜结果会列出其中声明的两个位置。删除一个即可消除错误。


更新 >>>

我不确定你期望得到什么样的答案...显然,如果你没有添加其中一个 InitializeComponent 方法定义,那就是 Visual Studio 的一个 bug。我非常怀疑除了这是一个 bug 之外,是否还有任何逻辑上的原因。

更新2>>>

我查看了Microsoft Connect网站,寻找了任何已报告的类似问题的bug,但没有找到...如果你想向他们报告此问题,请点击链接。


我并没有声明这段代码。当然,关于多个定义的情况这是正确的。但是,Visual Studio 声明了它。而不是我!这是自动生成的代码。问题是:为什么 Visual Studio 会生成错误的代码? - ouflak
回复:更新:是的,我完全愿意接受这个并向微软报告(我过去已经向他们报告了其他错误)。但很难想象没有人尝试从选项中添加其中一个默认项目并深入研究故障生成的原因,或者已经向微软报告了此问题。我认为我应该在互联网上找到那个。我将研究Visual Studio的错误报告机制。这是一个宏记录工具,您必须安装它。 - ouflak
从微软那里没有收到任何回复。我有点感觉他们认为这是Visual Studio 2010的问题,现在两个后续版本已经出来了,他们很愿意忽略它。 - ouflak
无论如何,感谢你的帮助。看起来我的公司很快会因为必要性而升级Visual Studio。我会看看是否存在类似的错误。 - ouflak
2
这也是Visual Studio 2017的一件事情。 - Tim
有人测试过这个问题在2019年是否仍然存在吗? - ouflak

4

我的问题在于给我造成歧义调用的项目有一个对其自身 dll 的引用。这导致该方法被从 dll 中引用以及在实际项目中引用。一旦我从引用中删除了 dll,歧义调用错误便消失了。


3

如果您在使用Resharper时不够警惕和小心,可能会出现这种情况。

当我编码时,我允许Resharper自动导入引用,结果就发生了这种情况。

一开始我打错了,然后编辑了我正在工作的代码,但没有检查它导入了什么。在遇到相同问题后,我意识到同一库中存在自引用。因此,该方法有两个实现。


今天遇到了这个问题,不幸的是我正在处理一个糟糕的项目,它使用了一个Table Adapter XSD文件,而这个文件被ReSharper完全破坏了,可能还有项目中一半的引用。 - Trevor
类似的问题,Resharper添加了对另一个项目的引用,而我已经在使用链接文件,因此出现了重复引用。通过查看.csproj文件中的git差异找到了问题所在。 - Eternal21
我还需要在此之后清除Resharper缓存,以消除错误(ReSharper > 选项... > 清除缓存)。 - Eternal21

1
我成功解决了这个问题,方法是使用文本编辑器查看 .csproj 文件并查找 Table Adapter XSD 文件的名称。我发现有两个引用,其中一个有不同的别名,这就是我收到此错误消息的原因。

只是要补充一下我的回答,这是由于我安装在Visual Studio 2015 CE上的ReSharper Ultimate(最新试用版)。 - Trevor

1
我刚刚遇到并解决了这个问题...
在WinForms程序中,当我复制一个表单并将其重命名为blah_Copy时,它发生在某个时候。
主cs文件和设计师cs文件都是部分类。因此,如果一个方法在两个文件中都定义了,并且它们具有相同的名称和参数(或相同的名称和相同数量的参数)/相同的签名,那么它们会冲突。
在我的情况下,它们都有相同的Initialize(){...}定义,因此我很容易地删除了其中一个。
此外,假设该方法为Initialize()(在我的情况下),如果您调用它本身,然后按F12,它将转到其中一个(或者甚至至少一个)定义。

1

我解决了这个问题,方法是清理 binobj 文件夹。你可以尝试删除这两个文件夹然后重新构建解决方案。


1

这两个类都是partial的,意味着它们共享非私有字段和方法。

你的ListBox1确实有两个InitializeComponent(共享)方法。 改变其中一个ListBox1的命名空间将解决此错误。


当然可以。但是为什么Visual Studio首次自动生成错误的代码呢?这就是问题所在。 - ouflak
1
如果你把两个列表框命名为“ListBox1”和“ListBox2”,我可以理解Visual Studio这样做。 - Jordy Langen
再次强调,我没有给任何东西命名或重命名。这都是Visual Studio代码。整个解决方案中只有这一个项目使用了这个名称。即使我的解决方案中有另一个列表框,它也会在不同的命名空间中,因为这是该命名空间中唯一的元素。 - ouflak
+1 鼓励你的帮助。我想这只是 Visual Studio 的测试人员没有经过并偶然发现了这个问题的情况。 - ouflak

1

我认为InitializeComponent()在同一个类中声明了两次。

使用CTRL+F查找两个类定义,并解决歧义。


我觉得这里的问题在于我的问题表述不够清晰。我会将相关部分加粗。请稍等... - ouflak
+1 对于 CTRL+F 的建议。我以前从未遇到过这个特定的快捷键功能。 - ouflak
@ouflak,即使是最简单的编辑程序中,它也是最标准的选项之一,甚至记事本都有它。几年前,一个人很震惊他的公交车司机不知道它,并将其公开宣传,但仍有一些人没有找到它。 - barlop
这仅在同一文件中有效。但可能有两个文件,即不同的名称,但具有相同的类,即部分类。例如,主文件和设计师文件。 - barlop

1
我遇到了一个问题,与用户控件和相关样式有关。我认为我尝试将一些逻辑移到样式类中,但它没有起作用,所以我撤销了它,但显然还留下了一些东西。
它也抱怨_contentLoaded变量,所以我尝试删除那个变量,错误就消失了,并且没有被另一个错误替换。然后我按F12键进入_contentLoaded的定义,并发现它在样式类的*.g文件中。虽然该文件以样式命名,但内部的类是以用户控件命名的。
我删除了bin和obj文件夹来解决这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接