我有两种方法。
1. public void Log(object tolog, string Instance)
2. public void Log(params object[] tolog)
我像这样调用Log,其中tolog1是一个对象
Log(tolog1,"Hello")
我很困惑为什么编译器选择了第二个重载。什么条件会导致这个?
答案 0 :(得分:3)
您的来电Log(tolog1,"Hello")
将使用由Overloading Resolution Rules (7.4.2)引起的方法Log(object tolog, string Instance)
。
给定参数列表,您的第一个方法重载Log(object tolog, string Instance)
是一个更合适/更接近的候选者,编译器可以根据指定的规则确定:
Overloading Resolution Rules (7.4.2)
- 给定一组适用的候选函数成员,找到该集合中最好的函数成员。
- 如果集合只包含一个函数成员,那么该函数成员是最好的函数成员。
- 否则,最佳函数成员是一个函数成员,它比给定参数列表中的所有其他函数成员更好,前提是将每个函数成员与所有其他函数成员进行比较Section 7.4.2.2中的规则。
- 如果没有一个函数成员优于所有其他函数成员,则函数成员调用为
发生模糊和编译时错误
在Section 7.4.2.2下,您会看到:
给定一个参数列表A,其中包含一组参数类型{A1,A2,..., AN}和两个适用的函数成员MP和MQ以及参数类型 {P1,P2,...,PN}和{Q1,Q2,...,QN},MP定义为更好 函数成员比MQ
- 对于每个参数,从AX到PX的隐式转换并不比从AX到QX的隐式转换更差,并且
- 对于至少一个参数,从AX到PX的转换优于从AX到QX的转换。
执行此评估时,如果MP或MQ适用于其中 扩展形式,然后PX或QX指的是扩展中的参数 参数列表的形式。
答案 1 :(得分:0)
简而言之,编译器选择更接近的类型,即处于层次结构/继承的最高级别的对象。
在您的情况下,Log(tolog1,"Hello")
,tolog1
同时满足重载
Log(params object[] tolog)
和Log(object tolog, string Instance)
但是在第二个参数"Hello"
的情况下,编译器会选择Log(object tolog, string Instance)
因为System.String
更接近" Hello"比System.Object