gpt4 book ai didi

c# - 在本地方法和 lambda 中重载

转载 作者:太空狗 更新时间:2023-10-29 17:47:38 26 4
gpt4 key购买 nike

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?

基本上就是将方法名引入方法内部的声明空间。在该声明空间内,名称​​仅 指的是局部方法……就像它对局部变量所做的那样。我认为这与在方法中引入名称一直有效的方式相当一致。

无论如何,我个人建议不要尝试这样做,因为它会引起混淆,但如果您真的需要引用类方法,只需明确说明即可:

ClassName.TestLocal("arg");

认为可以解决的是局部方法不能在它们之间重载。你不能写:

void Foo()
{
void Method(int x) {}
void Method(string y) {}
}

这是出于相关原因 - 方法的声明空间不能两次包含相同的名称,而类的声明空间可以这样做,就方法重载而言。也许围绕这个规则会放松......

关于c# - 在本地方法和 lambda 中重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48579516/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com