19

匿名関数がメソッドの引数として機能するのに、コンストラクターの引数では機能しないのはなぜですか?


を作成するList<string>と、次の署名を持つSortメソッドがあります。

public void Sort(IComparer<T> comparer)

ここで、次のように機能します。

List<string> list = new List<string>();
list.Sort( (a,b) => a.CompareTo(b) );

SortedSetには、同様のシグネチャを持つコンストラクタがあります。

public SortedSet(IComparer<T> comparer)

ただし、コンストラクターで無名関数を使用すると、これは失敗します。以下は無効です。

SortedSet<string> set = new SortedSet<string>( (a, b) => a.CompareTo(b) );

ソートクラスの作成は期待どおりに機能します。

public class MyComparer : IComparer<string>
{
    public int Compare(string a, string b)
    { return a.CompareTo(b); }
}

SortedSet<string> set = new SortedSet<string>( new MyComparer() );
4

4 に答える 4

32

これは、コンストラクターが(デリゲート)IComparer<T>ではなく (インターフェイス)を受け入れるためです。Comparison<T>Anon-methods / lambdas はデリゲートをサポートできますが、(直接) インターフェイスはサポートできません。ただし、ラップするのは非常に簡単です-たとえば:

class FuncComparer<T> : IComparer<T>
{
    private readonly Comparison<T> comparison;
    public FuncComparer(Comparison<T> comparison) {
        this.comparison = comparison;
    }
    public int Compare(T x, T y) {
        return comparison(x, y); }
}

これで、次を使用できます。

SortedSet<string> set = new SortedSet<string>(
      new FuncComparer<string>( (a, b) => a.CompareTo(b) ));
于 2010-06-28T08:23:50.617 に答える
0

あなたの場合、List.Sortはこの署名を使用します

public void Sort(Comparison<T> comparison)

しかし、これではありません

public void Sort(IComparer<T> comparer)
于 2010-06-28T08:27:13.477 に答える