You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何同名局部函数内调用静态方法需限定类名?

局部函数与静态方法名称冲突的编译错误解析

问题重现

定义包含静态方法的类:

public class Calculator
{
    public static decimal Calculate(decimal op1, decimal op2) => op1 * op2;
}

添加实例方法Foo调用该静态方法,代码可正常编译:

public decimal Foo(decimal op1, decimal op2)
{
    return Calculate(op1, op2);
}

但添加实例方法Bar,在其内部局部函数中调用静态方法时出现编译错误:

public decimal Bar((decimal op1, decimal op2) pair)
{
    return Calculate();

    decimal Calculate()
    {
        return Calculate(pair.op1, pair.op2);
    }
}

编译报错:

CS1501 No overload for method 'Calculate' takes 2 arguments

改用Calculator.Calculate(pair.op1, pair.op2)调用静态方法,或给局部函数更换名称,代码即可正常编译。

原因分析

这是C#的作用域内名称查找优先级规则导致的:

  • 在局部函数Calculate()的内部作用域中,编译器会优先查找当前作用域内的符号。无参数的局部函数Calculate()属于最内层作用域,所以编译器会优先匹配它,而非外层类的静态方法Calculator.Calculate(decimal, decimal)。
  • 由于该局部函数没有接受两个参数的重载,因此触发了CS1501错误。

两种解决方法的原理:

  • 用类名限定调用Calculator.Calculate(...):明确指定调用的是类的静态方法,跳过局部作用域的名称查找逻辑。
  • 修改局部函数名称:避免和外层静态方法重名,让编译器能正确定位到类的静态方法。

内容的提问来源于stack exchange,提问作者Bill Tür stands with Ukraine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 02:57:58