收益返回和异常处理[重复]

2023-11-22

我刚刚遇到一个使用yield return 的方法,但没有抛出我期望的ArgumentException 的情况。我在这里用最简单的类重建了这个案例:

class Program
{
    static void Main(string[] args)
    {
        try
        {
            var listA = FooA(count: 0);
            Console.WriteLine("A did not throw exception!");
        }
        catch (ArgumentException)
        {
            Console.WriteLine("A threw exception!");
        }

        try
        {
            var listB = FooB(count: 0);
            Console.WriteLine("B did not throw exception!");
        }
        catch (ArgumentException)
        {
            Console.WriteLine("B threw exception!");
        }

        Console.ReadLine();
    }

    private static IEnumerable<int> FooA(int count)
    {
        if(count == 0)
            throw new ArgumentException("Count must be above 0");
        var list = new List<int>();
        for (var i = 0; i < count; i++)
        {
            list.Add(i);
        }
        return list;
    }

    private static IEnumerable<int> FooB(int count)
    {
        if (count == 0)
            throw new ArgumentException("Count must be above 0");
        for (var i = 0; i < count; i++)
        {
            yield return i;
        }
    }
}

Output:

A threw exception!
B did not throw exception!

有人可以向我解释一下为什么 FooB 不抛出异常而 FooA 抛出异常吗?


这是因为FooB甚至从未被评估过。

当您调用一个方法时,该方法会立即被调用。当你使用yield并返回一个可枚举的,仅当某些东西需要使用返回的值时才会调用该方法,并且一次只能调用一个项目;这就是好处yielding.

因此,如果您添加使用该值的内容

try
{
    var listB = FooB(count: 0);
    Console.WriteLine(listB.First()); // use the IEnumerable returned
    Console.WriteLine("B did not throw exception!");
}
catch (ArgumentException)
{
    Console.WriteLine("B threw exception!");
}

您将看到您预期的结果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

收益返回和异常处理[重复] 的相关文章

随机推荐

  • 在 C 中使用 fread 从 stdin 缓冲读取

    我正在尝试有效地阅读stdin通过使用setvbuf在 IOFBF 模式下 我是缓冲新手 我在寻找working例子 输入以两个整数开始 n k 下一个n输入行包含 1 个整数 目的是打印有多少个整数可以被整除k define BUFSIZ
  • 无需注册事件源即可写入 Windows 应用程序事件日志

    有没有办法写入此事件日志 或者至少是其他一些 Windows 默认日志 我不必注册事件源 是的 有一种方法可以写入您正在寻找的事件日志 您不需要创建新的源 只需使用现有的源 该源通常与事件日志的名称相同 并且在某些情况下 例如事件日志应用程
  • 如何从纬度和经度点获取城市名称?

    有没有办法使用 javascript 的谷歌地图 api 从纬度和经度点获取城市名称 如果可以的话我可以看一个例子吗 这就是所谓的反向地理编码 来自谷歌的文档 http code google com apis maps documenta
  • 返回按钮在 iOS 7 中不可见

    我对 iOS 7 有一些奇怪的问题 我有一个UINavigationBar在我的应用程序中 它非常适合 iOS 6 IOS 6 然而 当我尝试在 iOS 7 上运行它时 我的后退按钮消失了 它就在那里 仍然可以工作并且可以点击 但不可见 I
  • LoadLibrary project.dll 失败。指定的模块无法找到

    当我尝试注册我的 C ATL 项目的 32 位版本时 regsvr32 project dll 我收到此错误 LoadLibrary project dll failed The specified module could not be
  • 将通用 Class 参数限制为实现 Map 的类

    我正在尝试写一个Map建设者 构造函数之一将允许客户端指定类型Map他们希望建立 public class MapBuilder
  • 删除/替换列值中的特殊字符?

    我有一个表列 其中包含我想从中删除所有连字符的值 这些值可能包含多个连字符并且长度各不相同 示例 对于我想要替换的所有值123 ABCD efghi with 123ABCDefghi 删除所有连字符并更新表中所有列值的最简单方法是什么 您
  • Windows Python2.7 mysqldb安装错误

    我正在尝试为 Python 安装 mysqldb 我正在运行 pip install mysql python 我不断收到此错误 运行 build ext构建 mysql 扩展创建 build temp win32 2 7创建 build
  • 在 MVC 框架中的 Javascript 文件中使用内联 C#

    我正在尝试使用 MVC 框架让内联 C 在我的 JavaScript 文件中工作 我编写了这个小测试代码 document ready function alert 当此代码在视图内部使用时 它可以完美地工作 当我离开我的 aspx 视图并
  • AngularJS:将服务注入 HTTP 拦截器(循环依赖)

    我正在尝试为我的 AngularJS 应用程序编写一个 HTTP 拦截器来处理身份验证 这段代码可以工作 但我担心手动注入服务 因为我认为 Angular 应该自动处理这个问题 app config httpProvider functio
  • 如何在matlab中制作圆并在其中生成随机点

    hello i want to ask a question how to make a circle in matlab and mark its center and generate a certain number of rando
  • 何时使用无符号值而不是有符号值?

    什么时候适合使用无符号变量而不是有符号变量 那么在一个for loop 我听到了很多关于这个问题的意见 我想看看是否有任何类似的共识 for unsigned int i 0 i lt someThing length i SomeThin
  • Haskell 中的 IO Int 和类似单元测试

    From 九十九道 Haskell 问题 问题23 从列表中提取给定数量的随机选择的元素 这是部分解决方案 为简单起见 此代码仅从列表中选择一个元素 import System Random randomRIO randItem a gt
  • 如果mysql表不存在则创建

    我不太使用 php mysql 但我需要一个我认为相对简单的任务 检查表是否存在 如果不存在则创建它 我什至无法获得有用的错误消息 并且数据库中没有创建表 显然我的语法有问题
  • 禁用 jqGrid 选定行的子网格扩展

    问题 带有子网格的 jqGrid 我想禁用主网格某些行的展开 折叠功能 我其实找到了一个方法 grid jqGrid setGridParam afterInsertRow function rowid aData rowelem var
  • 如何在对象数组中查询算法数据

    我有一个数据数组 其中 Algolia 索引中包含多个对象 如下所示 status available startDate 2000 10 20 endDate 2022 10 20 availablePlatform 1 2 3 avai
  • 将表标准化为第三范式

    这道题显然是一道家庭作业题 我听不懂我的教授 也不知道他在选举期间说了什么 我需要一步一步地进行说明 首先将下表规范化为 1NF 然后是 2NF 然后是 3NF 我感谢任何帮助和指导 好吧 我希望我都记得正确 让我们开始吧 Rules 让它
  • 如何使用节点谷歌客户端 API 来获取已获取令牌的用户配置文件?

    通过获取用户个人资料信息curl curl i https www googleapis com userinfo v2 me H Authorization Bearer a google account access token 通过获
  • 更改默认 JLabel 字体

    我将如何为所有人设置默认字体JLabel实例 而不是为每个设置字体JLabel独立 Use UIManager定义 JLabel 的默认字体 import java awt FlowLayout import java awt Font i
  • 收益返回和异常处理[重复]

    这个问题在这里已经有答案了 我刚刚遇到一个使用yield return 的方法 但没有抛出我期望的ArgumentException 的情况 我在这里用最简单的类重建了这个案例 class Program static void Main