J'ai été surpris aujourd'hui par la façon dont la résolution de la méthode fonctionne.Résolution de méthode C# avec inférence générique et de type
est ici le code comme 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);
}
}
Comme vous le voyez la méthode carte a deux surcharges, un lorsque le type de propriétés sont les mêmes, et un lorsque la propriété source est un dénombrable et la propriété right est un tableau.
Ensuite, quand j'appelle la méthode avec un tableau des deux côtés, il appelle la deuxième surcharge, mais comme les types sont exactement les mêmes, je m'attendais à ce que la première surcharge soit appelée. Je pensais que la première surcharge aurait un meilleur score car elle dépend de moins d'arguments génériques que la seconde, et elle correspond mieux aux types d'arguments que je passe à la méthode. Est-ce que quelqu'un peut expliquer pourquoi le compilateur choisit d'appeler la deuxième surcharge au lieu de la première s'il vous plaît?
Merci.
Vous appelez le mappeur avec une classe A et B, qui ne sont pas des tableaux. Ils ont tous deux une propriété qui est un tableau d'octets, mais ils ne sont pas du même type. – Glubus
Changez le byte [] en int et le premier est utilisé. Donc je suppose que c'est parce qu'un tableau d'octets est un IEnumerable. – user743414
Merci, mais la résolution devrait se produire sur TMember, pas TSource ou TTarget. Le TSource et TTarget sont différents par nature. –