我正在阅读有关代码分析器RCS1227的内容,它是这样写的:
迭代器方法(包含
的方法)在调用者开始枚举结果项之前不会验证参数。为了确保立即验证参数(调用方法时),请将迭代器移至单独的方法(本地函数)。yield
我不明白这指的是什么验证。在我看来,它指的是类型检查,但下面的代码示例正确地给出了构建错误,尽管没有为迭代器使用单独的函数。
public IEnumerable<int> GetIntegers()
{
var strings = new List<string> { "1", "2", "3" };
foreach(var s in strings)
{
yield return s; // <-- CS0029 Cannot implicitly convert type 'string' to 'int'
}
}
引用的解释是指什么验证?
问题中的链接包含两个代码示例,其中之一复制如下:
IEnumerable<object> Foo(IEnumerable<object> items)
{
if (items == null)
throw new ArgumentNullException(nameof(items));
foreach (object item in items)
yield return item;
}
这里所说的验证是指该方法内的验证(检查
items
是否为空),而不是C#类型检查。严格来说,迭代器函数造成的差异并不特定于验证 - 它同样适用于 Foo
方法中 yield return
之前的任何代码。