为何局部同名方法无法访问类中不同签名的同名重载方法?
问题解答:局部方法无法访问类中同名重载方法的原因
这是C#的**名称遮蔽(Shadowing)**机制导致的:当局部作用域里定义了和外层作用域同名的成员时,局部成员会“覆盖”外层的同名成员——编译器查找名称时,会从当前最内层的作用域开始找,只有当前作用域找不到匹配项,才会逐步往外找。
具体到你的代码场景:
- 在
OuterMethod里定义了局部方法InnerMethod(),这个名称和类级别的InnerMethod(string)完全同名。 - 当你在局部
InnerMethod()内部调用InnerMethod("hello")时,编译器首先在当前作用域的外层(也就是这个无参局部方法所在的OuterMethod局部作用域)查找InnerMethod,找到的是那个无参的局部方法,而它没有接受string参数的重载,所以直接抛出CS1501错误,根本不会去查找类级别的同名方法。 - 而调用
Test("hello")时,局部作用域里没有任何叫Test的方法,编译器就会继续向外查找,最终找到类里的Test(string)方法,因此可以正常执行。
如果要让局部方法访问类级别的InnerMethod(string),可以用this关键字明确指定调用类的成员,避免名称混淆:
void InnerMethod() { Test("hello"); // 正常调用类方法 this.InnerMethod("hello"); // 通过this明确指向类的方法,解决报错问题 }
内容的提问来源于stack exchange,提问作者Marcin
相关产品推荐
相关产品推荐

