web-dev-qa-db-ja.com

単一のメソッド、つまり拡張メソッド間で呼び出しがあいまいです

私は次のような拡張メソッドを持っています

public static class Extension
{
    public static string GetTLD(this string str)
    {
        var Host = new System.Uri(str).Host;
        int index = Host.LastIndexOf('.'), last = 3;
        while (index >= last - 3)
        {
            last = index;
            index = Host.LastIndexOf('.', last - 1);
        }
        var domain = Host.Substring(index + 1);
        return domain;
    }
}

そして私はこれを次のように呼んでいます

string domain = "." + _url.GetTLD();

ビルドとクリーンビルドでエラーは発生しません。
しかし、私はcompilation error実行時エラーが言っている

次のメソッドまたはプロパティ間で呼び出しがあいまいです: 'myIGNOU.Extension.GetTLD(string)'と 'myIGNOU.Extension.GetTLD(string)'

私は、この拡張メソッドをプロジェクトの他の場所にも配置していないことを誓います。実行時にのみこのエラーが発生するのはなぜですか。

しかし、このメソッドを削除すると、実行時ではなくビルド時にエラーが発生します。このメソッドのコードがなくても、すべて正常に機能します。

ここにコンパイルエラーページがあります

26
shashwat

これは実際の解決策ではなく、どのように機能したかを説明することはできませんが、機能しました。

プロジェクトのプロパティ、参照、bin、objのすべてを試していましたが、何も役に立ちませんでした。そして、私はすべてのオプションを試していて、コンテキストメニューから[Webアプリケーションに変換]を選択しました。以前はWebアプリケーションそのものでしたが。 .designer.csファイルが各aspxファイルに追加されるという警告が表示され、[OK]をクリックしただけです。

App_Codeフォルダー(これらすべてのクラスがあった)の名前がOld App_Codeに変更され、プロジェクトをビルドすることを除いて、すべて同じままでした。そして今、実行時にコンパイルエラーが発生していません。

App_CodeフォルダーがWebサイトプロジェクト用であることは知っていますが、WAPではこの時点まで問題はありませんでした。しかし、ここで wroxフォーラム(1番目のポイント) で説明されているように、WAPにApp_Codeフォルダーを含めるべきではないことに気づきました。著者はここでそれを言っています

App_CodeはWAPではサポートされていません。 App_Codeフォルダーはrun-time;でコンパイルされます。 WAP内のすべてのコードは、コンパイル/開発時にコンパイルされます。したがって、App_CodeフォルダーをWAPに追加する場合。重複したコードになってしまいます。たとえば、App_Codeで定義されたクラスはwapDLLにも表示されます。修正は簡単です。フォルダにClassesやCodeFilesなどの名前を付けるだけです。

変換前に名前を変更してみましたが、そのときは機能しませんでした。

14
shashwat

同じ問題が発生しましたが、プロジェクト参照から独自のプロジェクトを削除することで問題が解決しました。 Resharperは、同じプロジェクトのコンパイル済みバイナリへの参照を誤って追加しました。そうすれば、プロジェクト内で同じ拡張クラスを2回使用できました。ビルド中に、拡張クラスのソースバージョンとバイナリバージョンを区別できませんでした。

つまり、基本的には、プロジェクトの参照にそれ自体への参照が含まれているかどうかを確認してください。

@shashwatによって提供された回答もケースです。

69
Danielku15

私も同じ問題を抱えていました。いくつかの調査と実験の結果、(何らかの理由で)VisualStudioはApp_Codeフォルダーの拡張メソッドを好まないことがわかりました。私が見つけた最も簡単な解決策は、フォルダの名前を変更することでした。

2
Michael Kaldwid

私も同じ状況でした。拡張メソッドがあったカスタムグリッドコントロールがありました。メソッドは1か所でのみ宣言されました。コントロールは、私のソリューション全体で問題なく複数の場所で使用されていました。それからある日、同じプロジェクト内で文字通りコピーして貼り付けることにより、カスタムグリッドコントロールを実装するコントロールをコピーしました。次に、必要に応じてプロパティの名前を変更しました。その後、ソリューションは上記と同じエラーを引用して構築されませんでした。プロジェクトに追加されたコピーアンドペーストは、それ自体への参照であると思われます。

それを削除すると問題は解決しました。

1
lee

私の問題は、shashwatが説明しているものと似ていました。私の場合、コードファイルをApp_Codeディレクトリに配置しましたが、インテリセンスを取得するために、ファイル自体をコンパイルするように設定しました。これは、ファイルが実行時とコンパイル時の両方でコンパイルされていることを意味します。ファイルをApp_Codeから移動しました。

0
b_levitt

私は上記のコメントでこの解決策を見つけました。そしてそれは私を助けました。

プロジェクトAにプロジェクトAへの参照があります。誤って。

削除は役立ちます=)

0
Anton Semenov