2010-11-01 4 views
2

Я в настоящее время чтения Джона Скита C# в глубине 2-е издание, и следующий вопрос пришел мне на ум: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.

Если вы объявили другую перегрузку Sort в MyList (но принимая Comparison<T> вместо MyComparison<T>) затем вызов метода будет неоднозначным.

Для получения более подробной информации, см. Мой overload resolution article.

PS Надеюсь, что вы будете наслаждаться книгу :)

+0

Большое спасибо за помощь. (Мне нравится книга, большое спасибо за то, что нашли время, чтобы ее обновить). –

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

и вы получаете "Неоднозначный вызов" ошибка.

+0

Большое спасибо за вашу помощь –

+0

Добро пожаловать. –

+0

Я принял ответ Джона, поскольку он дал мне ссылку для получения более подробной информации, но также считает ваш ответ действительным слишком –

Смежные вопросы