带out和可选参数的方法重载

本文关键字:方法 重载 参数 out | 更新日期: 2023-09-27 17:51:08

为什么这样的重载在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;
}

带out和可选参数的方法重载

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

From $3.6 Signatures and overloading;

注意,任何ref和out形参修饰符(第10.5.1节)都是签名的一部分。因此,F(int)F(ref int)是唯一的签名。

第二个例子,c是可选参数。即使你在没有这个参数值的情况下调用3参数重载方法,但是编译器不能知道调用哪一个。

有关更多信息,请查看Eric Lippert关于此主题的回答

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

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