RCS1227规则:迭代器方法执行的参数验证指的是什么?
RCS1227规则中“即时验证”的具体含义
你的例子里的CS0029是编译时类型错误,属于C#编译器的静态检查范畴,和RCS1227规则关注的运行时参数验证完全是两个概念。
RCS1227针对的是带yield关键字的迭代器方法的特性:C#中,调用这类方法时不会立即执行方法体逻辑,而是先返回一个迭代器对象;只有当你通过foreach遍历、调用ToList()/ToArray()等触发MoveNext()时,才会真正执行方法体里的代码。
这就导致一个问题:如果方法里包含参数验证逻辑(比如检查参数是否为null、是否超出有效范围),这些验证不会在调用方法的瞬间触发,而是要等到迭代器开始工作时才会执行,错误发现被延迟。
举个典型场景对比:
不符合规则的写法(验证延迟)
public IEnumerable<int> GetPositiveNumbers(IEnumerable<int> input) { // 这个null检查要等到迭代器被遍历时才会执行 if (input == null) throw new ArgumentNullException(nameof(input)); foreach (int num in input) { if (num > 0) yield return num; } } // 调用方法时不会报错,直到遍历才触发异常 var iter = GetPositiveNumbers(null); // 这里无异常 var result = iter.ToList(); // 执行到这里才会抛出ArgumentNullException
符合规则的写法(即时验证)
public IEnumerable<int> GetPositiveNumbers(IEnumerable<int> input) { // 调用方法时立即执行验证,错误即时暴露 if (input == null) throw new ArgumentNullException(nameof(input)); // 把迭代器逻辑移到局部函数中 IEnumerable<int> Iterator() { foreach (int num in input) { if (num > 0) yield return num; } } return Iterator(); } // 调用方法的瞬间就会抛出ArgumentNullException,无需等到遍历 var iter = GetPositiveNumbers(null);
简单来说,RCS1227要求的“即时验证”,指的是运行时的参数合法性校验逻辑(比如null检查、数值范围校验、权限校验等),需要在方法被调用时立即执行,而不是延迟到迭代器启动后。你遇到的编译错误是编译器提前拦截的静态类型问题,和该规则的适用场景无关。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

