gpt4 book ai didi

c# - 方法重载决议系统如何决定在传递空值时调用哪个方法?

转载 作者:太空宇宙 更新时间:2023-11-03 15:47:21 25 4
gpt4 key购买 nike

例如你有这样一个类型:

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/27571455/

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