RCS1227 - 迭代器函数执行什么验证?

问题描述 投票:0回答:1

我正在阅读有关代码分析器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'
  }
}

引用的解释是指什么验证?

c# yield-return
1个回答
0
投票

问题中的链接包含两个代码示例,其中之一复制如下:

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
之前的任何代码。

© www.soinside.com 2019 - 2024. All rights reserved.