2010-11-01 29 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