解决与本地函数相关的错误和警告

本文介绍了以下编译器错误和警告:

  • CS8108:无法将具有动态类型的参数传递给局部函数“method”的 params 参数“parameter”。
  • CS8112: 本地函数“method”必须声明正文,因为它未标记为“static extern”。
  • CS8321: 声明本地函数“method”,但从未使用
  • CS8421: 静态本地函数不能包含对“variable”的引用。
  • CS8422: 静态本地函数不能包含对“this”或“base”的引用。

本地函数 已添加到 C# 7.0 中。 它们允许你在另一个成员内部声明帮助程序。 本文中的诊断涵盖本地函数声明、调用、用法和本地函数的额外捕获限制 static 。

局部函数体

  • CS8112: 本地函数“method”必须声明正文,因为它未标记为“static extern”。

本地函数声明必须包含函数体,除非本地函数被声明为 static extern。 将块正文或表达式正文添加到本地函数。 如果在外部提供实现,请标记本地函数 static extern ,并确保声明遵循外部方法的规则。

Params 形参和动态实参

  • CS8108:无法将动态类型的实参传递给本地函数“method”的 Params 形参“parameter”。

本地函数调用无法将 dynamic 参数传递给 params 参数。 将值转换为调用前参数预期的 params 元素类型或数组类型。 还可以将值存储在显式类型的数组中,并将该数组传递给本地函数。

未使用的本地函数

  • CS8321: 声明本地函数“method”,但从未使用

当你声明了一个局部函数,但没有任何可到达的代码调用它时,编译器会报告此警告。 删除未使用的本地函数,或从封闭成员中调用它。 如果你打算在将来的更改中使用局部函数,在需要之前不要将其加入源代码。

静态本地函数无法捕获状态

  • CS8421: 静态本地函数不能包含对“variable”的引用。
  • CS8422: 静态本地函数不能包含对“this”或“base”的引用。

static本地函数无法从封闭范围捕获状态。 它不能通过 this 或 this 自身引用封闭式本地变量、参数或实例成员。 传递本地函数所需的每个值作为参数(CS8421、CS8422)。 如果本地函数必须从封闭范围捕获变量或实例状态,请删除 static 修饰符。

以下示例显示了导致 CS8422 的引用:

public class C
{
    private int counter = 1;

    public void IncreaseCounter()
    {
        static void LocalFunc(int addition)
        {
            this.counter += addition;   // CS8422
            base.ToString();            // CS8422

            counter += addition;        // CS8422: implicit this
            ToString();                 // CS8422: implicit base
        }

        LocalFunc(10);
    }
}

若要修复 CS8422,请将所需的实例数据传递到本地函数,将帮助程序移到实例上下文之外,或删除 static 本地函数必须访问实例状态时。