gpt4 book ai didi

c# - 在 C# 中具有默认值的参数和具有相似签名的 void - 编译器如何知道要调用哪一个?

转载 作者:行者123 更新时间:2023-11-30 19:08:39 25 4
gpt4 key购买 nike

假设我有以下两种简单的方法:

class Question
{
public void MyMethod()
{
Console.WriteLine("no params here");
}

public void MyMethod(object o = null)
{
Console.WriteLine("an object here");
}
}

我这样调用一个:

new Question().MyMethod();

它导致无参数方法的调用,写入“此处无参数”。

我知道我仍然可以调用对方,例如喜欢

new Question().MyMethod(null);

但我的问题是,为什么编译器不警告我可能存在的歧义或强制我说清楚?它如何决定调用什么?只是参数少的那个?

最佳答案

And how does it decide what to call?

它应用 MS specification 中的规则或 ECMA standard (随你挑)。重载真的很复杂——尤其是当你有类型推断、继承、可选参数、无类型参数(例如nulldefault、方法组或 lambda 表达式)。

在这种情况下,它相对简单。这两种方法都适用,并且在参数转换方面没有一种比另一种“更好”,因为没有任何参数。然后是决胜规则——在这种情况下重要的是(ECMA 版本):

If neither function member was found to be better, and all parameters of MP have a corresponding argument whereas default arguments need to be substituted for at least one optional parameter in MQ, then MP is better than MQ. Otherwise, no function member is better.

换句话说,它没有歧义,因为一种方法没有可选参数而没有相应的参数,而另一种方法有。

请注意,这不是需要自动替换的“更少”可选参数的问题,而是“是否有”的问题。

举个例子,考虑一下:

class Question
{
public void MyMethod(int x = 1) {}
public void MyMethod(int x = 1, int y = 2) {}
}

class Test
{
static void Main()
{
// Ambiguous
new Question().MyMethod();
// Unambiguous
new Question().MyMethod(0);
}
}

第一次调用(无参数)是不明确的,因为两个适用的方法都有可选参数,但没有相应的参数。

第二次调用(一个参数)选择带有单个参数的方法,因为即使一个可选参数,它也有相应的参数——而带有两个参数的方法仍然有一个可选参数没有相应参数的参数。

关于c# - 在 C# 中具有默认值的参数和具有相似签名的 void - 编译器如何知道要调用哪一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49824025/

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