使用 out 和可选参数的方法重载

Method Overloading with out and optional parameter

为什么像这样的重载在 c# 中有效?

public string DisplayOverload(string a, string b, string c = "c")
{
    return a + b + c;
}
public string DisplayOverload(string a, string b, out string c)
{
    c = a + b;
    return a + b;
}

虽然这不起作用

public string DisplayOverload(string a, string b, string c = "c")
{
    return a + b + c;
}
public string DisplayOverload(string a, string b, string c)
{
    return a + b + c;
}

outref 被视为 方法签名的一部分。

来自 .6 Signatures and overloading;

Note that any ref and out parameter modifiers (Section 10.5.1) are part of a signature. Thus, F(int) and F(ref int) are unique signatures.

你的第二个例子,coptional argument。即使您在没有此参数值的情况下调用,也会调用 3 个参数重载方法,但编译器无法 知道调用哪一个。

有关详细信息,请查看有关此主题的 Eric Lippert's answer

带有输出参数的方法将具有不同的签名,而带有可选参数的方法可能具有相同的签名。

工作正常

DisplayOverload(string a, string b, string c)

DisplayOverload(string a, string b, out string c)

不行,因为签名是一样的

DisplayOverload(string a, string b, string c) - 可选 c 始终设置为默认值或其他值

DisplayOverload(string a, string b, string c)

因为对于第二对定义,编译器将无法区分 DisplayOverload("aa", "bb", "cc")(当您对第一个函数表示它时)和 DisplayOverload("aa", "bb", "cc")(当您对第二个函数表示它时)一个).

另一方面,编译器很容易区分string c; DisplayOverload("aa", "bb", c)string c; DisplayOverload("aa", "bb", out c)。注意最后一次调用中的 out