29

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

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)'

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

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

コンパイルエラーページはこちら

4

6 に答える 6

75

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

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

@shashwat が提供する回答もその 1 つです。

于 2013-09-24T09:26:38.120 に答える
2

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

于 2016-08-15T17:20:14.407 に答える
1

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

削除すると問題が解決しました。

于 2013-11-27T17:09:28.580 に答える
0

私の問題は、shashwat の説明と似ていました。私の場合、コード ファイルを App_Code dir に配置しましたが、IntelliSense を取得するために、ファイル自体をコンパイルするように設定しました。これは、ファイルが実行時とコンパイル時の両方でコンパイルされたことを意味する可能性があります。ファイルを App_Code から移動しました。

于 2016-05-23T17:23:37.860 に答える