本文介绍了以下编译器错误和警告:
- 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 本地函数必须访问实例状态时。
相关诊断
- 有关表达式树中的本地函数的详细信息,请参阅 C# 编译器消息 中的表达式树中禁止某些表达式 。
- 有关具有泛型类型参数的本地函数的详细信息,请参阅解决与 C# 编译器消息中的 泛型类型参数和类型参数相关的错误和警告 。
- 有关本地函数的属性的详细信息,请参阅解决涉及 C# 编译器消息中 代码中的属性声明和属性使用的错误和警告 。
- 有关匿名函数中捕获的变量的详细信息,请参阅 C# 编译器消息中的 Lambda 表达式错误和警告 。
- 有关构造函数和主构造函数中的捕获的详细信息,请参阅解决与 C# 编译器消息中的 构造函数声明和模块初始值设定项相关的错误 。