29

ReSharper 4用のアドインを作成しています。このために、いくつかの ReSharper のアセンブリを参照する必要がありました。アセンブリの 1 つ (JetBrains.Platform.ReSharper.Util.dll) にはSystem.Linq名前空間が含まれており、拡張メソッドのサブセットは System.Core によって既に提供されています。

コードを編集すると、これらの拡張機能の間にあいまいさが生じて、OrderByたとえば を使用できなくなります。どうすればこれを解決できますか?ReSharper のものではなく、コアLINQ拡張機能を使用したいと考えています。

コンパイルしようとすると、次のエラーが発生します。

次のメソッドまたはプロパティ間で呼び出しがあいまいです: ' System.Linq.Enumerable.OrderBy<string,int>(System.Collections.Generic.IEnumerable<string>, System.Func<string,int>)' and 'System.Linq.Enumerable.OrderBy<string,int>(System.Collections.Generic.IEnumerable<string>, System.Func<string,int>)'

編集:残念ながら運が悪いので、以下の提案を試しました。その間、への参照を削除して問題を「解決」しましたSystem.Core。このようにして、ReSharper DLL ファイルによって提供される拡張機能を使用できました。

必要な ReSharper DLL ファイルをインポートしたサンプル プログラムをアップロードしました。のエイリアスを に変更しSystem.Core、ディレクティブをSystemCore追加しましたextern aliasが、それでも機能しませんでした。何か見逃した場合は、お知らせください。PS参照は、のデフォルトディレクトリにインストールされたReSharper v4.1 DLLファイルです"C:\Program Files\JetBrains\ReSharper\v4.1\..."

4

10 に答える 10

43

これはおそらく、 extern エイリアスを使用することが理にかなっているまれなケースの 1 つです。

System.Core への参照のプロパティ ページ (つまり、[参照] の下で [System.Core] を選択し、右クリックして [プロパティ] を選択) で、[エイリアス] の値を「global,SystemCore」に変更します (場合によっては単に「SystemCore」に変更します)。最初は空白です)。

次に、コードに次のように記述します。

extern alias SystemCore;
using SystemCore::System.Linq;

これにより、System.Core.dll の System.Linq 名前空間で関連するすべての型などが利用可能になります。ここでの「SystemCore」という名前は任意です。「DotNet」などと呼んでもかまいません。

于 2009-01-17T15:42:21.457 に答える
7

これは実際には答えではありませんが、他の人が問題を再現するためのより簡単な方法を提供する可能性があります (コマンドラインから - 必要に応じて Visual Studio の 2 つのプロジェクトで実行できます)。

1) BadLinq.cs を作成し、BadLinq.dll としてビルドします。

using System.Collections.Generic;

namespace System.Linq
{
    public static class Enumerable
    {
        public static IEnumerable<T> Where<T>(this IEnumerable<T> source, 
                                              Func<T,bool> predicate)
        {
            return null;
        }
    }
}

2) Test.cs を作成します。

extern alias SystemCore;

using System;
using SystemCore::System.Linq;

static class Test
{
    static void Main()
    {
        var names = new[] { "Larry", "Curly", "Moe" };

        var result = names.Where(x => x.Length > 1);
    }
}

3) extern エイリアスを指定して Test.cs をコンパイルします。

csc Test.cs /r:BadLinq.dll /r:SystemCore=System.Core.dll

これは次の場合に失敗します。

Test.cs(11,28): エラー CS1061: 'System.Array' には 'Where' の定義が含まれておらず、タイプ 'System.Array' の最初の引数を受け入れる拡張メソッド 'Where' が見つかりませんでした (あなたはusing ディレクティブまたはアセンブリ参照がありませんか?)

拡張メソッド (Enumerable.Where など) を使用しないように変更すると、extern エイリアスで正常に動作します。

これはコンパイラのバグかもしれないと思います。C# チームが読むプライベート メーリング リストに電子メールを送信しました。返信があり次第、この回答を更新するか、新しい回答を追加します。

于 2009-01-17T19:47:55.827 に答える
2

.NET 3.0 をターゲットにしている場合でも、ReSharper DLL ファイルによって提供される LINQ 拡張機能を使用できるため、これはもはや問題ではありません。

スキート氏はまた正しかった!プロジェクトのプロパティで .NET 3.0 をターゲットにし、System.Core を参照せずに、完全な LINQ 構文を使用できます。

于 2009-01-18T08:09:10.450 に答える
2

ReSharper が使用されるさまざまなソリューションと可能な限り互換性を保つために、ReSharper は .NET 2.0 に対して構築されています。LINQ などは C# 3.0 で導入されたため、そのバージョンのフレームワークでは使用できません。そのため、JetBrains は独自のバージョンで追加されました。

解決策は、.NET 2.0 に対してもアドインをビルドすることです。

于 2011-04-14T11:37:44.900 に答える
1

System.ComponentModel を使用してあいまいな参照の問題がありました。Visual Studio は、DLL ファイルが v2 と v4 の両方に存在すると不平を言っていました。システムDLLファイルへの参照を削除して再読み込みすることで解決できました。

于 2013-08-29T16:20:35.300 に答える
0

1 つの解決策は、すべてのコードを ReSharper コードを使用する部分クラスに移動することです。そこでは、ReSharper 名前空間のみをインポートし、System.Core はインポートしません。

部分クラスの残りの部分では、System.Core を含む必要な他のすべての名前空間をインポートしますが、ReSharper 名前空間はインポートしません。

于 2009-01-17T21:33:04.400 に答える
0

これは実際にはコンパイル エラーです。

私は同じ問題を抱えていましたが、プロジェクトをクリーンアップして再構築するだけで解決しました。その後、問題はなくなりました。

于 2010-11-05T11:56:12.817 に答える
0

extern エイリアスを使用しても同じ問題が発生し、Connectのコンパイラ バグとして取り上げました。当面の回避策は、拡張メソッドの構文を使用しないことです。

Visual Studio 2010 のバグが修正されました。

于 2010-01-28T22:20:03.130 に答える