gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:54:17 27 4
gpt4 key购买 nike

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

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

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

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

最佳答案

解析方法重载的规则将尝试选择具有最具体类型匹配的方法头。 Here您可以阅读更多关于重载决议和 here 的信息我认为是你的情况。

来自 MSDN:

Given an argument list A with a set of argument types {A1, A2, ..., AN} and two applicable function members MP and MQ with parameter types {P1, P2, ..., PN} and {Q1, Q2, ..., QN}, MP is defined to be a better function member than MQ if

  • for each argument, the implicit conversion from AX to PX is not worse than the implicit conversion from AX to QX, and

  • for at least one argument, the conversion from AX to PX is better than the conversion from >AX to QX.

When performing this evaluation, if MP or MQ is applicable in its expanded form, then PX or QX refers to a parameter in the expanded form of the parameter list.

关于c# - 在 C# 中解决方法重载的优先规则是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13474428/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com