gpt4 book ai didi

c# - 选择不同的重载方法,具体取决于使用空参数调用它的位置

转载 作者:行者123 更新时间:2023-11-30 16:45:24 26 4
gpt4 key购买 nike

我有一个重载 Format 方法的类。

 class FormatStuff
{
public static string Format(object arg)
=> HandleObjectStuff();

public static string Format(IEnumerable<object> args)
=> HandleListStuff();
}

现在,当我打电话

FormatStuff.Format(null);

我以 IEnumerable 参数结束了第二次重载。但就我而言,我从这样的函数中调用该方法:

 public static string DoStuff(IEnumerable<int> intnumerable)
{
StringBuilder sb = new StringBuilder();
sb.Append(FormatStuff.Format(intnumerable));
return sb.ToString();
}

当我调用这个函数时

DoStuff(null);

我在第一个重载中以单个对象参数结束,即使在这两种情况下都将 null 作为参数传递。

这是为什么?我可以做些什么来结束与 DoStuff 参数类型匹配的第二次重载?

编辑:该问题已被标记为可能重复 this一。我认为情况并非完全如此,因为帮助我理解我的问题的重点是 IEnumerable<int>不是 IEnumerable<object> .一般来说,这意味着,不能期望任何类型的 IEnumerable 是对象的 IEnumerable,我不知道。上述帖子中未得出此结论。

最佳答案

要调用(绑定(bind))的重载在编译时对于每个调用表达式都是静态固定的(除非您在编译时使用类型 dynamic)。仅仅因为您用于参数的表达式在程序运行时恰好评估为另一种类型,所以重载不会神奇地改变。

例子:

FormatStuff.Format(null);

编译时类型不存在(null),但由于存在从 null 的隐式转换直译为 objectnull 的隐式转换至 IEnumerable<object>同样,两个重载都是候选者。在那种情况下,重载 IEnumerable<object>首选,因为它更具体。

FormatStuff.Format((object)null);

在这种情况下,表达式的编译时类型是 object ,因此只有一个重载适用,并且已被使用。

IEnumerable<int> intnumerable
// ...
FormatStuff.Format(intnumerable);

在上述情况下,您传递的编译时类型是 IEnumerable<int> .这里int是一个值类型。一个IEnumerable<int>不是 IEnumerable<object>在编译时。 这在编译时是固定的; intnumerable 是否存在无关紧要。恰好是 null在运行时,如果非空,则实际类型(某些具体类或结构实现 IEnumerable<int>)在运行时是什么并不重要。

IEnumerable<string> strEnumerable
// ...
FormatStuff.Format(strEnumerable);

最后,在这种情况下,因为 string是引用类型,IEnumerable<out T> 的编译时协方差适用。所以IEnumerable<string> 一个IEnumerable<object> .因此,两种重载都适用,最具体的一种是首选。

关于c# - 选择不同的重载方法,具体取决于使用空参数调用它的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42204104/

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