在C#中解决方法重载的优先规则是什么?

时间:2012-11-20 13:36:21

标签: c# dynamic overloading overload-resolution

我正在编写一个序列化程序,我希望广泛使用方法重载,序列化派生自IEnumerable<T>IDictionary<K,V>等类型的对象。

我还打算使用dynamic关键字让C​​LR根据要序列化的对象的运行时类型选择正确的重载。

看一下这段代码:

void Serialize<TKey, TValue>(IDictionary<TKey, TValue> dictionary)
{
  Console.WriteLine("IDictionary<TKey, TValue>");
}

void Serialize<TKey, TValue>(IEnumerable<KeyValuePair<TKey, TValue>> items)
{
  Console.WriteLine("IEnumerable<KeyValuePair<TKey, TValue>>");
}

void Serialize<T>(IEnumerable<T> items)
{
  Console.WriteLine("IEnumerable<T>");
}

我想这样做:

void CallSerialize(object obj)
{
   Serialize(obj as dynamic); //let the CLR resolve it at runtime.
}

现在基于obj的运行时类型,将调用正确的重载。例如,

//Test code
CallSerialize(new List<int>()); //prints IEnumerable<T>

在这种情况下,调用第三个重载并且基本原理非常简单:这只是可行的选项。

但是,如果我这样做:

CallSerialize(new Dictionary<int,int>()); //prints IDictionary<TKey, TValue>

它调用第一个重载。我不太明白这一点。当所有三个重载都是可行的选项时,为什么它会解决第一次重载

实际上,如果我删除第一个,则调用第二个重载,如果我删除第一个和第二个重载,则调用第三个重载。

解决方法重载的优先顺序是什么?

1 个答案:

答案 0 :(得分:6)

解决方法重载的规则将尝试选择具有最特定类型匹配的方法标头。 Here您可以阅读有关重载决策的更多信息,here我认为是您的情况。

来自MSDN:

  

给定一个参数列表A,其中包含一组参数类型{A1,A2,...,AN}和两个适用的函数成员MP和MQ,参数类型为{P1,P2,...,PN}和{Q1 ,Q2,...,QN},MP被定义为比MQ更好的函数成员

     
      
  • 对于每个参数,从AX到PX的隐式转换并不比从AX到QX的隐式转换更差,并且

  •   
  • 对于至少一个参数,从AX到PX的转换优于从&gt; AX到QX的转换。

  •   
     

执行此评估时,如果MP或MQ适用于其扩展形式,则PX或QX引用参数列表的展开形式的参数。