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

时间:2014-06-23 13:49:08

标签: c# logging

我有两种方法。

    1. public void Log(object tolog, string Instance)
    2. public void Log(params object[] tolog)

我像这样调用Lo​​g,其中tolog1是一个对象

Log(tolog1,"Hello") 

我很困惑为什么编译器选择了第二个重载。什么条件会导致这个?

2 个答案:

答案 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