方法重载.编译器如何决定使用哪个

本文关键字:决定 编译器 重载 何决定 方法 | 更新日期: 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.StringSystem.Object更接近"Hello"