在本地方法和 lambda 中重载
Overloading in local methods and lambda
static void Main() {
void TestLocal() => TestLocal("arg");
TestLocal("arg");
}
static void TestLocal(string argument) {
}
在这个例子中,局部函数与我要重载的另一个方法同名。但是这个方法在这个函数内部是不可见的,甚至在 Main()
内部也是不可见的。 lambdas 也是如此:
static void Main() {
Action TestLambda = () => TestLambda("arg");
}
static void TestLambda(string argument) {
}
我明白了,为什么 lambda 隐藏了外部方法——因为它是一个局部变量,而局部变量总是这样工作的。但我看不出有任何理由让局部函数隐藏而不重载外部方法——它对于减少局部范围内的参数量、进行某种携带可能非常有用。
为什么局部函数隐藏方法?
编辑:
我可以想象一个复杂的例子
void Bar(short arg) {
Console.WriteLine("short");
}
void Bar(byte arg) {
Console.WriteLine("byte");
}
void Test() {
void Bar(int arg) {
Console.WriteLine("int");
}
Bar(0);
}
参数类型解析已经够复杂了。如果他们将重载添加到本地方法,这对于求职面试来说将是一项更愚蠢的任务,对于编译器制造商来说将是一项更艰巨的任务。还有 virtual
和 new
方法...
Why local functions hide methods?
基本上就是在方法内部的声明space中引入方法名。在该声明 space 中,名称 only 指的是局部方法……就像它对局部变量所做的那样。我认为这与引入方法的名称一直有效的方式相当一致。
我个人建议无论如何不要尝试这样做,因为它会引起混淆,但如果您真的需要参考 class 方法,只需明确说明即可:
ClassName.TestLocal("arg");
我所做的认为可以解决的是本地方法不能在它们之间重载。你不能写:
void Foo()
{
void Method(int x) {}
void Method(string y) {}
}
这是一个相关的原因 - 方法的声明 space 不能包含两次相同的名称,而 class 的声明 space 可以 这样做,在方法重载方面。也许围绕这个规则会放松......
static void Main() {
void TestLocal() => TestLocal("arg");
TestLocal("arg");
}
static void TestLocal(string argument) {
}
在这个例子中,局部函数与我要重载的另一个方法同名。但是这个方法在这个函数内部是不可见的,甚至在 Main()
内部也是不可见的。 lambdas 也是如此:
static void Main() {
Action TestLambda = () => TestLambda("arg");
}
static void TestLambda(string argument) {
}
我明白了,为什么 lambda 隐藏了外部方法——因为它是一个局部变量,而局部变量总是这样工作的。但我看不出有任何理由让局部函数隐藏而不重载外部方法——它对于减少局部范围内的参数量、进行某种携带可能非常有用。
为什么局部函数隐藏方法?
编辑:
我可以想象一个复杂的例子
void Bar(short arg) {
Console.WriteLine("short");
}
void Bar(byte arg) {
Console.WriteLine("byte");
}
void Test() {
void Bar(int arg) {
Console.WriteLine("int");
}
Bar(0);
}
参数类型解析已经够复杂了。如果他们将重载添加到本地方法,这对于求职面试来说将是一项更愚蠢的任务,对于编译器制造商来说将是一项更艰巨的任务。还有 virtual
和 new
方法...
Why local functions hide methods?
基本上就是在方法内部的声明space中引入方法名。在该声明 space 中,名称 only 指的是局部方法……就像它对局部变量所做的那样。我认为这与引入方法的名称一直有效的方式相当一致。
我个人建议无论如何不要尝试这样做,因为它会引起混淆,但如果您真的需要参考 class 方法,只需明确说明即可:
ClassName.TestLocal("arg");
我所做的认为可以解决的是本地方法不能在它们之间重载。你不能写:
void Foo()
{
void Method(int x) {}
void Method(string y) {}
}
这是一个相关的原因 - 方法的声明 space 不能包含两次相同的名称,而 class 的声明 space 可以 这样做,在方法重载方面。也许围绕这个规则会放松......