web-dev-qa-db-ja.com

Identical.NameSpace.InitializeComponent()とIdentical.NameSpace.InitializeComponent()のメソッド間での呼び出しがあいまいです。

わかりました、これはVisual Studioの問題かもしれませんが、これにはいくつかの理由があるはずです。デフォルトアイテムのリストからListBoxを作成しました(プロジェクトを右クリックするか、プロジェクト内のフォルダー->追加->新しいアイテム-> Xamlリストボックス)。すぐに私はエラーで赤い波線を取得します:

「エラー2次のメソッドまたはプロパティのあいまいな呼び出しです: 'Identical.NameSpace.ListBox1.InitializeComponent()'と 'Identical.NameSpace.ListBox1.InitializeComponent()' C:\ Documents and Settings\ouflak\My Documents\Visual Studio 2010\Projects\Identical\NameSpace\ListBox1.xaml.cs 27 "

問題のコードはすべて自動生成され、エラーの原因は2つの自動生成されたファイル(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 Professionalのバグである場合、私は本当に知りたいと思います。

11
ouflak

InitializeComponentメソッドをクラスの2か所で宣言しているようです。おそらく各部分クラスに1つあります。 Visual StudioですべてのファイルでInitializeComponentを検索してみてください。結果には、宣言されている場所が2つ表示されると思います。 1つ削除すると、エラーが消えます。


更新>>>

ここでどのような答えを期待しているのかわかりません...明らかに、これらのInitializeComponentメソッド定義のいずれかを追加しなかった場合、Visual Studioにバグがあります。バグであることを除いて、これには何らかの論理的な理由がある可能性があることを私は非常に疑っています。

アップデート2 >>>

Microsoft Connect のWebサイトで、このような報告された既存のバグがないか確認しましたが、見つかりませんでした...報告したい場合は、ここにリンクを残しました。

12
Sheridan

コントロール間でXAMLをコピーするときにこの問題が発生しました。私はx:Class = "mynamespace"を変更する必要がありました。mynamespaceはプロジェクトの適切な名前空間です。再コンパイルして、すべてを通常に戻しました。

10
Behr

私の問題は、あいまいな呼び出しを私に与えていたプロジェクトが独自のdllへの参照を持っていることでした。これにより、実際のプロジェクトだけでなく、dllからもメソッドが参照されていました。参照からdllを削除すると、あいまいな呼び出しエラーがなくなりました。

4
huskytusky

Resharperの使用方法について注意深く、注意深くない場合に発生する可能性があります。

これは、コーディング中にResharperに参照の自動インポートを許可したときに起こりました。

そのため、最初にタイプミスしてから、作業中のコードを編集して、何がインポートされたかを確認しませんでした。同じ問題に遭遇した後、同じライブラリに自己参照があることに気付きました。したがって、問題のメソッドの二重実装がありました。

3
user919426

テキストエディターで.csprojファイル内を調べ、テーブルアダプターXSDファイルの名前を探すことで、これを解決することができました。エイリアス名の異なる2つの参照が見つかりました。このエラーメッセージが表示されたのはなぜですか。

1
Tahir Khalid

どちらのクラスも部分的です。つまり、非プライベートフィールドとメソッドを互いに共有します。

きみの ListBox1には2つのInitializeComponent(共有)メソッドがあります。どちらかの名前空間を変更するListBox1はこのエラーを解決します。

1
Jordy Langen

私はこの問題に遭遇し、ユーザーコントロールとそれに関連するスタイルがありました。ロジックをスタイルクラスに移動しようとしたが、機能しなかったので、元に戻したが、何かが残っているようだ。

_contentLoaded変数についても不平を言っていたので、そこにある変数を削除してみましたが、エラーはなくなり、別のエラーに置き換えられませんでした。次にF12を押して_contentLoadedの定義に移動し、スタイルクラスの* .gファイルにあることがわかりました。ファイルはスタイルにちなんで名付けられましたが、内部のクラスはユーザーコントロールにちなんで名付けられました。

Binとobjフォルダーを削除して解決しました。

1
Chris

InitializeComponent()は、同じクラスの2つの異なる場所で宣言されていると思います。

CTR + Fを使用して両方のクラス定義を見つけ、解決してあいまいさを解決してください。

1

私はちょうどこれを持っていて解決しました。

これは、WinFormsプログラムでフォームを複製している間またはその後のある時点で発生し、名前をblah_Copyに変更しました。

メインのcsファイルとデザイナのcsファイルは、どちらも部分クラスです。したがって、メソッドが両方で定義されていて、名前とパラメーターが同じ(または名前が同じでパラメーターがない)場合、/同じシグネチャは競合します。

私の場合、どちらのInitialize(){..}定義も同じボディを持っていたので、簡単に削除できました。

また、メソッドがInitialize()であるとしましょう(私の場合)。自分自身を呼び出す場合は、F12を押すと、定義の1つ(またはおそらく少なくとも1つ)に移動します。

1
barlop

binおよびobjフォルダーをクリーンアップして、この問題を修正しました。これら2つのフォルダーを削除してから、ソリューションを再構築してください。

0
bus1hero