【发布时间】:2017-07-01 10:35:38
【问题描述】:
我有一个具有重载 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 one 重复。我不认为情况完全如此,因为帮助我理解我的问题的重点是,IEnumerable<int> 不是IEnumerable<object>。
一般来说,这意味着,不能指望任何类型的 IEnumerable 是对象的 IEnumerable,这是我不知道的。
上述帖子未得出此结论。
【问题讨论】:
-
IEnumerable<int>不是IEnumerable<object>,因此不适用过载。 -
那为什么我直接用
FormatStuff.Format(null);调用Format函数的时候会出现IEnumerable重载呢? -
null是一个IEnumerable<object>,它比object“更具体”,因此选择了重载。如果您使用IEnumerable<int>调用Format,则仅适用object重载。请参阅this answer,其中描述了如何解决重载问题。
标签: c# overloading