方法重载.编译器如何决定使用哪个
本文关键字:决定 编译器 重载 何决定 方法 | 更新日期: 2023-09-27 18:09:50
我有两个方法。
1. public void Log(object tolog, string Instance)
2. public void Log(params object[] tolog)
我这样调用Log,其中tolog1是一个对象
Log(tolog1,"Hello")
我很困惑为什么编译器选择了第二个重载。什么情况会导致这种情况?
您的调用Log(tolog1,"Hello")
将使用方法Log(object tolog, string Instance)
,这是因为重载解决规则(7.4.2)。
给定参数列表,你的第一个方法重载Log(object tolog, string Instance)
是一个更合适/更接近的候选,编译器可以确定,因为指定的规则:
重载解析规则(7.4.2)
- 给定适用的候选函数成员集,在该集合中找到最佳函数成员。
- 如果集合只包含一个函数成员,则该函数成员为最佳函数成员。
- 否则,最好的函数成员是一个函数成员,在给定的参数列表方面优于所有其他函数成员,前提是每个函数成员都使用第7.4.2.2节中的规则与所有其他函数成员进行比较。
- 如果没有一个函数成员优于所有其他函数成员,则该函数成员调用是
歧义且发生编译时错误
在第7.4.2.2节中,你将看到:
给定一个参数列表A,其参数类型为{A1, A2,…,AN}和两个具有参数类型的函数成员MP和MQ{p1, p2,…, PN}和{Q1, Q2,…, QN}, MP定义为一个更好的函数成员小于MQ if
- 对于每个参数,从AX到PX的隐式转换并不比从AX到QX的隐式转换差,并且
- 对于至少一个参数,从AX到PX的转换优于从AX到QX的转换。
在执行此评估时,如果MP或MQ适用于其展开形式,则PX或QX表示展开形式中的参数参数列表格式。
简而言之,编译器选择更接近的类型,即位于层次/继承的最高级别的对象。
在您的示例中,Log(tolog1,"Hello")
、tolog1
满足两个重载
Log(params object[] tolog)
和Log(object tolog, string Instance)
,但对于第二个参数"Hello"
,编译器选择Log(object tolog, string Instance)
,因为System.String
比System.Object
更接近"Hello"