4

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

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

看看这个代码片段:

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>

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

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

解决方法重载的优先规则是什么?

4

1 回答 1

6

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

来自 MSDN:

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

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

  • 对于至少一个论点,从 AX 到 PX 的转换优于从 >AX 到 QX 的转换。

在执行此评估时,如果 MP 或 MQ 以其扩展形式适用,则 PX 或 QX 指的是参数列表的扩展形式中的参数。

于 2012-11-20T14:07:28.953 回答