今天我对方法解析的工作方式感到惊讶。
下面以代码为例:
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);
}
}
如您所见,方法 Map 有两种重载,一种是属性类型相同时,另一种是源属性是可枚举且正确的属性是数组时。
然后,当我在两侧调用带有数组的方法时,它调用第二个重载,但由于类型完全相同,我希望调用第一个重载。
我认为第一个重载会有更好的得分,因为它依赖的泛型参数比第二个少,而且它更适合我传递给方法的参数类型。
有人可以解释为什么编译器选择调用第二个重载而不是第一个重载吗?
谢谢。