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



我正在编写一个序列化程序,我想在其中广泛使用方法重载,以序列化从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>

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

事实上,如果我去掉第一个,就会调用第二个重载,如果我去除第一个和第二个过载,那么就会调用第三个重载。

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

解决方法重载的规则将尝试选择具有最特定类型匹配的方法标头。在这里,你可以阅读更多关于过载解决方案的内容,我认为这就是你的情况。

来自MSDN:

给定一个参数列表A,该参数列表A具有一组参数类型{A1,A2,…,an}和两个适用的函数成员MP和MQ,该函数成员具有参数类型{P1,P2,…,PN}和{Q1,Q2,…,QN},如果

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

  • 对于至少一个自变量,从AX到PX的转换比从>AX到QX。

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

相关内容

  • 没有找到相关文章

最新更新