2009-07-24 5 views
0

???????の代わりに何を書いていますか?適切な過負荷を選択するには?C#で適切な非ジェネリックオーバーロードを参照するには?

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]); 
     } 
    } 
} 

答えて

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) {} 

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

+0

ありがとう、私の悪い! – UserControl

0

これは、値で何をしたいかによって異なります。あなただけのデリゲートを渡したい場合は、この場合は、次の

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

を行うことができ、<C>部分が実際にオフにしておくことができます。コンパイラはパラメータを推論することができます。

comparerというパラメータに対してAction<T,T>を選択したのは興味があります。比較関数は、通常、2つの値を比較した結果を表す値を返します。 Action<T,T>タイプは単にvoidを返します。それはおそらく、比較関数

  • 変更値を返さない関数のよりindicitive何かにパラメータ名のためのより標準的な署名であるFunc<T,T,int>に変更のいずれか

    1. でなければなりません。 del、action、funcと同様です。
  • 関連する問題