【问题标题】:The call is ambiguous between the following methods: Identical.NameSpace.InitializeComponent() and Identical.NameSpace.InitializeComponent()以下方法之间的调用不明确:Identical.NameSpace.InitializeComponent() 和 Identical.NameSpace.InitializeComponent()
【发布时间】:2013-12-23 14:39:45
【问题描述】:

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

"错误2以下方法之间的调用不明确或 属性:'Identical.NameSpace.ListBox1.InitializeComponent()' 和 'Identical.NameSpace.ListBox1.InitializeComponent()' C:\Documents 和 设置\ouflak\我的文档\Visual Studio 2010\Projects\Identical\NameSpace\ListBox1.xaml.cs 27"

所有有问题的代码都是自动生成的,错误的原因是因为两个自动生成的文件之间存在冲突:ListBox1.g.cs 和 ListBox1.designer.cs 其中public voidInitializeComponent() 是在两者中声明。在这种情况下,代码自然无法编译。我想只需删除 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 文件的 cmets。

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

【问题讨论】:

  • 这一切都在一个项目中吗? (即,其他相同的命名空间是否可能来自引用的程序集)?
  • 为什么要删除代码示例中的所有命名空间?
  • 没问题,我会添加它们...
  • 看看这是否有帮助:unknown error upon rebuilding WPF project。查看您是否不小心将 .designer.cs 文件作为项目的一部分包含在内。
  • 好奇:如果您在解决方案资源管理器中右键单击 ListBox1.xaml 并单击“运行自定义工具”,错误是否仍然存在?似乎至少应该重新生成 .g.cs 文件。 stackoverflow.com/a/9948546/674077 不管怎样,我知道问题仍然存在,为什么它首先会这样生成。

标签: c# wpf visual-studio xaml toolbox


【解决方案1】:

复制和粘贴后,以及在代码中重命名新类,还打开设计器并更改 XAML 第一行中的名称。构建项目。已修复!

【讨论】:

  • 谢谢,但“修复”这个错误不是问题。那是微不足道的。问题在于,这只是通过简单地依赖默认选项和生成的自动生成代码来显示的。没有其他控件显示此问题,也不应该真正显示此问题。您使用的是什么版本的 Visual Studio?
【解决方案2】:

一次更改一堆文件后我遇到了同样的问题,这是我修复它的方法:

  • 在解决方案资源管理器中查找解决方案(查看 -> 解决方案资源管理器)
  • 右键单击解决方案,然后单击“清理解决方案”

.. 就是这样! Visual Studio 有时会很奇怪..

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我刚刚解决了这个问题..

      这发生在我在 WinForms 程序中复制表单期间或之后的某个时间点,然后将其重命名为 blah_Copy。

      主cs文件和设计器cs文件都是部分类。因此,如果在两者中都定义了一个方法,并且它具有相同的名称和参数(或相同的名称和相同的无参数),/相同的签名,那么它将发生冲突。

      就我而言,它们都是 Initialize() { .. } 定义,具有相同的主体,所以我很容易就删除了一个。

      还可以说方法是 Initialize() (在我的情况下)。如果你去调用自己,然后按 F12,它将转到定义之一((或什至可能至少一个)。

      【讨论】:

        【解决方案5】:

        我设法通过使用文本编辑器查看 .csproj 文件并查找 Table Adapter XSD 文件的名称来解决此问题。我发现了两个对它的引用,其中一个具有不同的别名,因此我收到此错误消息。

        【讨论】:

        • 只是为了添加到我自己的答案中,这是由于我在 Visual Studio 2015 CE 上安装的 ReSharper Ultimate(最新试用版)
        【解决方案6】:

        如果您对使用 Resharper 的方式不够警觉和小心,就会发生这种情况。

        当我在编码时允许 Resharper 自动导入引用时,这发生在我身上。

        所以最初输入错误,然后编辑了我正在处理的代码,我没有检查它导入的内容。遇到同样的问题后,我意识到在同一个库中有一个自引用。所以有问题的方法有双重实现。

        【讨论】:

        • 不幸的是,今天遇到了这个问题,正在处理一个使用 Table Adapter XSD 文件的悲惨项目,该文件被 ReSharper 完全丢弃,并且可能是项目中一半的引用
        • 类似问题,Resharper 添加了对另一个项目的引用,我已经使用了一个链接文件,因此是双重引用。通过查看 .csproj 文件中的 git 差异发现了它。
        • 之后我还必须清除 Resharper 缓存以消除错误(ReSharper > 选项... > 清除缓存)
        【解决方案7】:

        我的问题是给我模棱两可的调用的项目引用了它自己的 dll。这导致从 dll 以及在实际项目中引用该方法。一旦我从引用中删除了 dll,模棱两可的调用错误就消失了。

        【讨论】:

          【解决方案8】:

          我遇到了这个问题,有一个用户控件和一个关联的样式。我想我曾尝试将一些逻辑移入样式类,但它不起作用,所以我取消了它,但显然有些东西被遗忘了。

          它还抱怨 _contentLoaded 变量,所以我尝试删除那里的变量,错误消失了,并且没有被另一个错误替换。然后我按 F12 转到 _contentLoaded 的定义,发现它在样式类的 *.g 文件中。虽然文件是以样式命名的,但里面的类是以用户控件命名的。

          我删除了 bin 和 obj 文件夹来解决它。

          【讨论】:

            【解决方案9】:

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

            【讨论】:

            • 有趣。也许这会对某人有所帮助。 +1
            • 过去让我印象深刻的另一个问题是,当您从 A 类的 XAML 到 B 类的 XAML 进行剪切粘贴,却忘记更改 B 的 x:Class 时。编译错误可以为 A 类报告,这令人困惑,因为 A 的 XAML 或代码隐藏都没有问题,也没有迹象表明问题实际上出在另一个类。
            【解决方案10】:

            我认为 InitializeComponent() 是在同一个类的两个不同位置声明的。

            尝试使用 CTR+F 找到两个类定义,然后解决歧义。

            【讨论】:

            • 我认为这里的问题是我的问题不清楚。我将加粗相关部分。等等……
            • +1 表示 CTRL+F 建议。我从来没有遇到过那个特殊的功能快捷方式。
            • @ouflak 即使是最简单的编辑程序,它也是最标准的选项之一,即使记事本也有。几年前,一个人害怕他的公交车司机不知道这件事,并对其进行了更多宣传,但仍然有些人设法没有找到它。
            • 也只有在同一个文件中才有效。但是可能有两个文件,即不同的名称,但具有相同的类,一个部分类。例如主文件和设计器文件
            【解决方案11】:

            看来您已经在类中的两个位置声明了InitializeComponent 方法,可能在每个部分类中都有一个。尝试在 Visual Studio 中在所有文件中搜索InitializeComponent,我猜结果将列出两个声明它的位置。删除一个,错误就会消失。


            更新>>>

            我不确定您在这里期待什么样的答案...显然,如果您没有添加其中一个 InitializeComponent 方法定义,那么 Visual Studio 就有一个错误。我非常怀疑这是否有任何合乎逻辑的原因,除了它是一个错误。

            更新 2 >>>

            我在Microsoft Connect 网站上查看了任何现有报告的此类错误,但找不到任何...如果您确实想向他们报告,我已将链接留在这里。

            【讨论】:

            • 我还没有声明这个代码。当然,多重定义也是如此。但是,Visual Studio 再次声明了这一点。不是我!这是自动生成的代码。问题是:Visual Studio 为什么会生成错误代码?
            • RE:更新:是的,我非常愿意接受这一点并将其报告给 Microsoft 和所有内容(我过去曾向他们报告过其他错误)。但是很难想象没有人试图从选项中添加这些默认项之一并挖掘错误生成的原因,和/或已经将其报告给 Microsoft。我想我会在互联网上的某个地方找到它。我将研究 Visual Studio 的错误报告机制。这是一个宏录制的东西,他们已经设置好你必须安装。
            • 没有收到 Microsoft 的任何回复。我有种感觉,他们认为这是 Visual Studio 2010 的东西,并且非常愿意忽略它,现在已经发布了两个后续版本。
            • 无论如何 +1 试图提供帮助。看来我的公司将很快升级 Visual Studio。我会看看那里是否存在类似的错误。
            • 这也是 Visual Studio 2017 的东西。
            【解决方案12】:

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

            您的ListBox1 确实有两个InitializeComponent(共享)方法。更改 ListBox1 的命名空间将解决此错误。

            【讨论】:

            • 当然可以。但是为什么 Visual Studio 首先会自动生成错误代码呢?这就是问题所在。
            • 我可以理解 Visual Studio 这样做,如果您将两个列表框命名为 ListBox1
            • 再一次,我没有命名或重命名任何东西。这是所有 Visual Studio 代码。这是整个解决方案中唯一具有此名称的项目。即使我的解决方案中有另一个列表框,它也会位于不同的命名空间中,因为这是该命名空间中的唯一元素。
            • +1 试图提供帮助。我想这只是 Visual Studio 的测试人员没有经历和偶然发现这个问题的一个例子。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-01-06
            • 2012-02-09
            • 1970-01-01
            • 2015-12-31
            • 2020-01-19
            • 1970-01-01
            相关资源
            最近更新 更多