为什么像这样的重载是在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;
}
答案 0 :(得分:3)
out
和ref
被视为方法签名的一部分。
来自$3.6 Signatures and overloading;
请注意,任何ref和out参数修饰符(第10.5.1节)都是 签名的一部分。因此,
F(int)
和F(ref int)
是唯一的 签名。
您的第二个示例c
是optional 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
。