C# 方法重载。编译器如何决定使用哪个?

C# 方法重载。编译器如何决定使用哪个?,c#,logging,C#,Logging,我有两种方法 1. public void Log(object tolog, string Instance) 2. public void Log(params object[] tolog) 我这样调用Log,其中tolog1是一个对象 Log(tolog1,"Hello") 我不明白为什么编译器选择了第二个重载。什么情况会导致这种情况?您的调用Log(tolog1,“Hello”)将使用方法Log(objecttolog,string Instance),这是因为

我有两种方法

    1. public void Log(object tolog, string Instance)
    2. public void Log(params object[] tolog)
我这样调用Log,其中tolog1是一个对象

Log(tolog1,"Hello") 
我不明白为什么编译器选择了第二个重载。什么情况会导致这种情况?

您的调用
Log(tolog1,“Hello”)
将使用方法
Log(objecttolog,string Instance)
,这是因为

给定参数列表,您的第一个方法重载
Log(object-tolog,string-Instance)
是一个更合适/更接近的候选者,由于指定的规则,编译器可以确定:

  • 给定一组适用的候选函数成员,将找到该集合中的最佳函数成员
  • 如果集合仅包含一个函数成员,则该函数成员是最佳函数成员
  • 否则,最好的函数成员是相对于给定参数列表优于所有其他函数成员的函数成员,前提是使用中的规则将每个函数成员与所有其他函数成员进行比较
  • 如果没有一个函数成员优于所有其他函数成员,则函数成员调用为
    不明确,出现编译时错误
在下面,您将看到:

给定一个参数列表A,其中包含一组参数类型{A1,A2。。。, 一个}和两个具有参数类型的适用函数成员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”)
将使用方法
Log(objecttolog,string实例)
,这是因为

给定参数列表,您的第一个方法重载
Log(object-tolog,string-Instance)
是一个更合适/更接近的候选者,由于指定的规则,编译器可以确定:

  • 给定一组适用的候选函数成员,将找到该集合中的最佳函数成员
  • 如果集合仅包含一个函数成员,则该函数成员是最佳函数成员
  • 否则,最好的函数成员是相对于给定参数列表优于所有其他函数成员的函数成员,前提是使用中的规则将每个函数成员与所有其他函数成员进行比较
  • 如果没有一个函数成员优于所有其他函数成员,则函数成员调用为
    不明确,出现编译时错误
在下面,您将看到:

给定一个参数列表A,其中包含一组参数类型{A1,A2。。。, 一个}和两个具有参数类型的适用函数成员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”)
将使用方法
Log(objecttolog,string实例)
,这是因为

给定参数列表,您的第一个方法重载
Log(object-tolog,string-Instance)
是一个更合适/更接近的候选者,由于指定的规则,编译器可以确定:

  • 给定一组适用的候选函数成员,将找到该集合中的最佳函数成员
  • 如果集合仅包含一个函数成员,则该函数成员是最佳函数成员
  • 否则,最好的函数成员是相对于给定参数列表优于所有其他函数成员的函数成员,前提是使用中的规则将每个函数成员与所有其他函数成员进行比较
  • 如果没有一个函数成员优于所有其他函数成员,则函数成员调用为
    不明确,出现编译时错误
在下面,您将看到:

给定一个参数列表A,其中包含一组参数类型{A1,A2。。。, 一个}和两个具有参数类型的适用函数成员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”)
将使用方法
Log(objecttolog,string实例)
,这是因为

给定参数列表,您的第一个方法重载
Log(object-tolog,string-Instance)
是一个更合适/更接近的候选者,编译器可以根据规则指定来确定这一点