0

???????の代わりに何を書くのですか??????? 適切な過負荷を選択するには?

using System;
using System.Collections.Generic;

namespace ConsoleApplication2
{
    class A {}

    class B : A {}

    class C : A {}

    class Program
    {
        static void Main(string[] args)
        {
            var l1 = new List<C>();
            var l2 = new List<C>();
            Comparer<C>(l1, l2, ???????);
        }

        void Compare(C a, C b) { }

        void Compare(B a, B b) {}

        void Compare<T>(IList<T> a, IList<T> b, Action<T,T> comparator)
        {
            for (int i = 0; i < a.Count; i++)
                comparator(a[i], b[i]);
        }
    }
}
4

2 に答える 2

5

メソッドを静的にし、メソッド名を修正するだけです。Compare:への最初の呼び出しで型推論を使用することもできます。

static void Main(string[] args)
{
    var l1 = new List<C>();
    var l2 = new List<C>();

    Compare(l1, l2, Compare);
}

static void Compare(C a, C b) {}

static void Compare(B a, B b) {}

static void Compare<T>(IList<T> a, IList<T> b, Action<T,T> comparator)
{
    for (int i = 0; i < a.Count; i++)
        comparator(a[i], b[i]);
}

この場合、あいまいさCompare(C, C)はありません-グループ内で。に変換できる唯一のメソッドAction<C, C>です。メソッドがある場合でもCompare(A, A)、より具体的なメソッドが選択されます。代わりに次のようにすると、あいまいになります。

static void Compare(A a, C b) {}
static void Compare(C a, A b) {}

ただし、このような場合は、可能な限り過負荷を回避することを強くお勧めします。メソッドに個別の名前を付けます。これにより、読みやすくなり、あいまいさを回避できます。

于 2009-07-24T06:04:49.377 に答える
0

それはあなたが値で何をしたいかに依存します。代理人を渡すだけの場合は、次のようにすることができます

Comparer<C>(l1,l2, (left,right) => {});

この場合、<C>部分は実際には省略できます。コンパイラーはパラメーターを推測できるようになります。

Action<T,T>comparerという名前のパラメーターの選択について興味があります。比較関数は通常、2つの値を比較した結果を表す値を返します。タイプはAction<T,T>単にvoidを返します。どちらかである可能性があります

  1. Func<T,T,int>比較関数のより標準的な署名に変更されました
  2. パラメータ名を、値を返さない関数を示すよりわかりやすい名前に変更します。デル、アクション、ファンクのように。
于 2009-07-24T06:03:59.393 に答える