例如你有这样一个类型:
public class EffectOptions
{
public EffectOptions ( params object [ ] options ) {}
public EffectOptions ( IEnumerable<object> options ) {}
public EffectOptions ( string name ) {}
public EffectOptions ( object owner ) {}
public EffectOptions ( int count ) {}
public EffectOptions ( Point point ) {}
}
这里我只是给出了使用构造函数的例子,但如果它们是类型本身的非构造函数方法,结果将是相同的,对吧?
所以当你这样做的时候:
EffectOptions options = new EffectOptions (null);
将调用哪个构造函数,为什么?
我可以自己测试这个,但我想了解重载解析系统是如何工作的(不确定它是不是这么叫的)。
最佳答案
有关确切规则,请参阅 the overload resolution spec .但简而言之,它是这样的。
首先,列出所有可访问 构造函数。
public EffectOptions ( params object [ ] options )
public EffectOptions ( IEnumerable<object> options )
public EffectOptions ( string name )
public EffectOptions ( object owner )
public EffectOptions ( int count )
public EffectOptions ( Point point )
接下来,消除所有不适用 的构造函数。适用的构造函数是每个形式参数都有一个相应的参数,并且该参数可以隐式转换为形式参数类型的构造函数。假设 Point 是一个值类型,我们排除了“int”和“Point”版本。剩下
public EffectOptions ( params object[] options )
public EffectOptions ( IEnumerable<object> options )
public EffectOptions ( string name )
public EffectOptions ( object owner )
现在,我们必须考虑带有“params”的参数是否适用于其扩展 或未扩展 形式。在这种情况下,它适用于两种形式。当发生这种情况时,我们将丢弃扩展 形式。这样就剩下了
public EffectOptions ( object[] options )
public EffectOptions ( IEnumerable<object> options )
public EffectOptions ( string name )
public EffectOptions ( object owner )
现在我们必须确定适用候选人中的最佳。最佳规则很复杂,但简而言之就是越具体越好。长颈鹿比哺乳动物更具体,哺乳动物比动物更具体,动物比物体更具体。
object
version 比所有版本都更不具体,因此可以将其删除。 IEnumerable<object>
版本不如 object[]
具体版本(你知道为什么吗?)所以它也可以被删除。剩下
public EffectOptions ( object[] options )
public EffectOptions ( string name )
现在我们被困住了。 object[]
不比 string
更具体或更不具体.因此,这会产生歧义错误。
这只是一个简短的草图;真正的打破平局的算法要复杂得多。但这些都是基础。
关于c# - 方法重载决议系统如何决定在传递空值时调用哪个方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5173339/