在本地方法和 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);
}

参数类型解析已经够复杂了。如果他们将重载添加到本地方法,这对于求职面试来说将是一项更愚蠢的任务,对于编译器制造商来说将是一项更艰巨的任务。还有 virtualnew 方法...

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 可以 这样做,在方法重载方面。也许围绕这个规则会放松......