CA2264 自动修复后报 CS0501:箭头方法不能只留分号
SDK 10.0.402 的 CA2264 修复可删除整段表达式方法体,留下不合法的分号声明。对非可空 int 的无效 ThrowIfNull 检查,人工保留合法空块并审查 diff,不改变原方法签名。
执行 dotnet format analyzers 后,本来能编译的类突然报 CS0501,方法声明末尾只剩一个分号。若这次修复包含 CA2264,检查它是否删除了表达式方法体里的 ArgumentNullException.ThrowIfNull。
SDK 10.0.402、net10.0 的具体输入,是已有类中的方法片段;文件已导入 System:
public void M(int value) => ArgumentNullException.ThrowIfNull(value);
对非可空 int 调用 ThrowIfNull 没有空值检查意义,CA2264 的提醒本身成立;问题在于该版代码修复可能只移除箭头主体,留下 public void M(int value);。普通类中的这个方法没有 abstract、extern 或相应 partial 声明,因此不能这样省略实现。
删除调用时仍要保留合法的方法体
这段逻辑确实没有其他工作时,可以人工改成空块:
public void M(int value) { }
实际文件仍应保留命名空间、类及原有访问修饰符。方法签名可能属于公共接口,不要为了消除未使用参数,就顺便删参数或改成 abstract。这里只处理已经确认无效的空检查,不代表所有 ThrowIfNull 都应删除;引用类型和可空值具有不同语义。
如果本来希望校验 int 的范围,应按业务规则另写范围校验;不能把空检查自动替换成随意选择的正数判断。尤其不要把 nullable 参数改成非 nullable,仅为了让分析器不再报错。
审查自动修复的 diff,而不是继续修整个解决方案
先保留自动修复前后的差异,确认箭头方法是否被改成了无主体声明。已写入文件的错误需要先恢复或人工修正;只更换格式化器版本,不会自动把旧 diff 还原。
10.0.402 的正式 fixer 通过移除被定位调用的父语法节点实施修改,但没有在这段逻辑中把箭头成员替换为完整空块。原调用位于普通块里的表达式语句,与整份箭头方法体,并不是相同的删除上下文。
近期具体组合中的表达式 lambda、局部函数没有被修成同样的错误声明,不能据此把所有箭头语法或所有 CA2264 结果一起批量重写。先把受影响的自动应用范围收紧,保留仍有帮助的诊断,再逐处处理方法体;没有必要关闭全部分析器。
验收先编译修改后的实际项目,确认 CS0501 消失且公开签名没有改变,再检查原方法需要保留的行为与相关调用。后续采用新的正式工具链时,仍要用箭头成员和普通块两种形态检查修复结果,不以分析器提示数量减少代替编译通过。


