2010-11-01 30 views
2

我目前正在讀的深度第2版喬恩斯基特的C#分辨率和以下問題來到我的腦海:LAMBDA委託

怎麼樣編譯器能夠在下面的例子中list.Sort(Comparison<T>)list.Sort(MyComparison<T>)之間做出選擇:

// MyComparison has the same signature as Comparison<in T> 
public delegate int MyComparison<in T>(T x, T y); 

public class MyList<T> : List<T> 
{ 
    // Sort is like Sort(Comparison<T>) except it takes a MyComparison<T> in parameter 
    public int Sort(MyComparison<T> comparison) 
    { 
     Console.WriteLine("Sort MyComparison<T>"); 
     return -1; 
    } 
} 

MyList<Product> list = new MyList<Product>(); 

list.Sort((product1, product2) => product1.Name.CompareTo(product2.Name)); 

// Equivalent to 
list.Sort(new MyComparison<Product>((product1, product2) => product1.Name.CompareTo(product2.Name))); 

// But not equivalent to... 
list.Sort(new Comparison<Product>((product1, product2) => product1.Name.CompareTo(product2.Name))); 

在此先感謝

回答

2

如果重載遇到一個適用的方法,它將使用在巴宣佈一個優先於任何方法 se類。因此,在這種情況下,前兩個調用似乎不存在List<T>.Sort

第三次調用不是適用,所以它會找到List<T>.Sort來代替。

如果申報中MyListSort(但考慮Comparison<T>代替MyComparison<T>)另一個重載然後方法調用是不明確的。

有關更多詳細信息,請參閱我的overload resolution article

PS希望您會喜歡這本書:)

+0

非常感謝您的幫助。 (我喜歡這本書,非常感謝你花時間更新它)。 – 2010-11-01 15:07:40

5

它選擇一個,因爲它是在子類中,它更喜歡那些。

例如:

public class MyList<T> : List<T> 
{ 
    public int Sort2(MyComparison<T> comparison) 
    { 
    } 
    public int Sort2(Comparison<T> comparison) 
    { 
    } 
} 

在這種情況下,現在不理解和:

list.Sort2((product1, product2) => product1.Name.CompareTo(product2.Name)); 

,你會得到一個 「的號召是ambigous」 錯誤。

+0

非常感謝您的幫助 – 2010-11-01 15:02:21

+0

不客氣。 – 2010-11-01 15:05:19

+0

我接受喬恩的答案,因爲他給了我一個更詳細的鏈接,但認爲你的答案也有效 – 2010-11-01 15:11:44