Лямбда для делегирования резолюции - PullRequest
2 голосов
/ 01 ноября 2010

В настоящее время я читаю C # Джона Скита подробно во втором издании, и мне пришёл в голову следующий вопрос:

Как компилятор может выбирать между 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 ]

5 голосов
/ 01 ноября 2010

Он выбирает тот, потому что он находится в дочернем классе и предпочитает их.

Например:

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

и вы получите ошибку «Вызов неоднозначен».

2 голосов
/ 01 ноября 2010

Если разрешение перегрузки встречается с применимым методом, оно будет использовать его вместо любых методов, объявленных в базовых классах.Таким образом, в этом случае, как будто List<T>.Sort даже не существует для первых двух вызовов.

Третий вызов не применим, поэтому он найдет List<T>.Sortвместо этого.

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

См. Мою статью по разрешению перегрузки *1020* для получения более подробной информации.

PS Надеюсь, вам понравится книга:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...