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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 17:05:03