2009-07-24 29 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 2009-07-24 06:15:54

0

這取決於你想要對值做什麼。如果你只是想傳遞一個委託,你可以做以下

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

在這種情況下,<Ç>部分實際上可以離開。編譯器將能夠推斷出這些參數。

我很好奇你選擇了Action<T,T>作爲名爲comparer的參數。比較函數通常會返回一個表示比較兩個值的結果的值。 Action<T,T>類型只返回void。它應該有可能是要麼

  1. 改爲Func<T,T,int>這是一個比較函數
  2. 更改參數名稱的東西更indicitive不返回值的函數的更標準的簽名。像del,action或func一樣。
相關問題