因此,例如,您有一个类似的类型:

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版本比所有版本都不具体,因此可以删除。 IEnumerable<object>版本不如object[]版本具体(您知道为什么吗?),因此也可以将其删除。那离开

public EffectOptions ( object[] options )
public EffectOptions ( string name )


现在我们陷入困境。 object[]的具体含义与string相同。因此,这产生了歧义错误。

那只是一个简短的草图;真正的平局决胜法要复杂得多。但这是基础。

关于c# - 当传递空值时,方法重载解决方案系统如何确定要调用哪个方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53468188/

10-17 02:15