Я был удивлен сегодня тем, как работает разрешение метода.Разрешение метода C# с общим и типом вывода
Вот код, как Exemple:
class Program
{
static class Mapper<TSource, TTarget>
{
public static void Map<TMember>(Expression<Func<TSource, TMember>> source, Expression<Func<TTarget, TMember>> target)
{
Console.WriteLine("A");
}
public static void Map<TMember, TSourceCollection>(Expression<Func<TSource, TSourceCollection>> source, Expression<Func<TTarget, TMember[]>> target)
where TSourceCollection : IEnumerable<TMember>
{
Console.WriteLine("B");
}
}
class A
{
public byte[] prop { get; set; }
}
class B
{
public byte[] prop { get; set; }
}
static void Main(string[] args)
{
Mapper<A, B>.Map(x => x.prop, x => x.prop);
}
}
Как вы видите, метод Карта имеет два перегруженных, один, когда тип свойства одинаковы, и один, когда свойство источника перечислимого и right - массив.
Тогда, когда я вызываю метод с массивом с обеих сторон, он вызывает вторую перегрузку, но поскольку типы точно такие же, я ожидал, что первая перегрузка будет вызвана.
Я думал, что первая перегрузка будет иметь лучший результат, потому что она зависит от меньшего количества общих аргументов, чем вторая, и она лучше подходит для типов аргументов, которые я передаю методу.
Может кто-нибудь объяснить, почему компилятор предпочитает переводить вторую перегрузку вместо первой?
Спасибо.
Вы называете преобразователь классом A и B, которые не являются массивами. Оба они имеют свойство, которое является байтовым массивом, но они не одного типа. – Glubus
Используется изменение байта [] на int и первое. Поэтому я предполагаю, что это потому, что байтовый массив является IEnumerable. – user743414
Спасибо, но разрешение должно возникнуть на TMember, а не на TSource или TTarget. TSource и TTarget отличаются по своей природе. –