static void Main() {
void TestLocal() => TestLocal("arg");
TestLocal("arg");
}
static void TestLocal(string argument) {
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,本地函数与另一个我想要重载的方法具有相同的名称.但是这个方法在这个函数内部是不可见的,甚至从内部也是如此Main().lambda也是如此:
static void Main() {
Action TestLambda = () => TestLambda("arg");
}
static void TestLambda(string argument) {
}
Run Code Online (Sandbox Code Playgroud)
我明白,为什么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);
}
Run Code Online (Sandbox Code Playgroud)
参数类型解析已经足够复杂了.如果他们将重载添加到本地方法,对于求职面试来说这将是一项更愚蠢的任务,对编译器制造商来说则是一项更大的任务.还有方法virtual和new方法......
Jon*_*eet 10
为什么本地函数隐藏方法?
基本上它将方法名称引入方法内的声明空间.在该声明空间中,名称仅引用本地方法......就像它对局部变量一样.我认为这与引入方法的名称一直有效的方式相当一致.
我个人建议不要试图这样做,因为它会引起混淆,但如果你真的需要引用类方法,那就明白:
ClassName.TestLocal("arg");
Run Code Online (Sandbox Code Playgroud)
我也觉得可能是固定的,是本地方法可以彼此之间没有超载.你不能写:
void Foo()
{
void Method(int x) {}
void Method(string y) {}
}
Run Code Online (Sandbox Code Playgroud)
这是出于相关原因 - 方法的声明空间不能包含两次相同的名称,而类的声明空间可以在方法重载方面这样做.也许规则会在这周围放松......