使用 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;
}
out
和 ref
被视为 方法签名的一部分。
来自 .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.
你的第二个例子,c
是 optional 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
。
为什么像这样的重载在 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
和 ref
被视为 方法签名的一部分。
来自 .6 Signatures and overloading;
Note that any ref and out parameter modifiers (Section 10.5.1) are part of a signature. Thus,
F(int)
andF(ref int)
are unique signatures.
你的第二个例子,c
是 optional 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
。