方法使用out和optional参数重载

时间:2015-05-29 10:31:30

标签: c# overloading

为什么像这样的重载是在c#中工作的?

std::shared_ptr<Mat>

虽然这不起作用

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;
}

3 个答案:

答案 0 :(得分:3)

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

来自$3.6 Signatures and overloading;

  

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

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

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

答案 1 :(得分:0)

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

正常工作

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)

答案 2 :(得分:0)

因为使用第二对定义,编译器无法从DisplayOverload("aa", "bb", "cc")告诉DisplayOverload("aa", "bb", "cc")(当你的意思是第一个函数时)(当你的意思是它的时候一个)。

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