为什么编译器不抱怨不是所有路径都返回?

时间:2018-11-23 01:23:20

标签: c# .net visual-studio visual-studio-2017

我在do..while中有这个名字:

yield return string.Join(",", arr) + "\n";

为什么编译器不抱怨不是所有的代码路径都返回值?

完整的代码示例如下:

    public static IEnumerable<string> Convert(Stream stream)
    {
        System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);

        IExcelDataReader reader = ExcelReaderFactory.CreateBinaryReader(stream);
        var csvContent = string.Empty;
        do
        {
            while (reader.Read())
            {
                var arr = new List<string>();
                for (int i = 0; i < reader.FieldCount; i++)
                {
                    var cell = reader[i]?.ToString();
                    var format = reader.GetNumberFormatString(i);
                    if (format == "mm\\/dd\\/yyyy" || format == "M/d/yyyy")
                    {
                        cell = cell.Replace(" 12:00:00 AM", "");
                    }
                    if (format == "h\\:mm\\:ss AM/PM")
                    {
                        cell = cell.Replace("12/31/1899 ", "");
                    }
                    var processedCell = cell == null ? string.Empty : cell.Contains(",") ? "\"" + cell + "\"" : cell;
                    arr.Add(processedCell);
                }
                yield return string.Join(",", arr) + "\n";
            }
        } while (reader.NextResult());
    }

没有return关键字作为最后一行!

2 个答案:

答案 0 :(得分:5)

这是与IEnumerable迭代器模式和yield return关键字有关的例外。在这种情况下,编译器将为迭代器运行时构造其状态机,并且不会像使用线性方法那样应用相同的路径覆盖集。

语义是:“不会产生的迭代器为空,并且这同时是对未明确返回值的任何代码路径的有效替代”。

理解这一点的关键是,编译器将构成迭代器的方法重新构造为不再具有未初始化返回值的代码。有关示例,请参见C#标准的10.4.4.1章。

相关:https://stackoverflow.com/a/9631242/1132334

答案 1 :(得分:0)

因为您使用的是收益率 yield return 方法不是以return结尾,而是实际上以 yield break 和最后一个 yield break 可以省略

UPD。这是旧代码(Robotics Studio和Unity)的示例,其中最后一行存在 yield break enter image description here enter image description here