Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么编译器不抱怨不是所有路径都返回?_C#_.net_Visual Studio_Visual Studio 2017 - Fatal编程技术网

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

C# 为什么编译器不抱怨不是所有路径都返回?,c#,.net,visual-studio,visual-studio-2017,C#,.net,Visual Studio,Visual Studio 2017,我在一个do..while里有这个: 产生返回字符串。Join(“,”,arr)+“\n” 为什么编译器不抱怨并非所有代码路径都返回值? 完整的代码示例如下所示: public static IEnumerable<string> Convert(Stream stream) { System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);

我在一个
do..while
里有这个:

产生返回字符串。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());
    }
公共静态IEnumerable转换(流)
{
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
IExcelDataReader=ExcelReaderFactory.CreateBaryReader(流);
var csvContent=string.Empty;
做
{
while(reader.Read())
{
var arr=新列表();
对于(int i=0;i

最后一行没有
返回
关键字这是与
IEnumerable
迭代器模式和
yield return
关键字相关的一个例外。在本例中,编译器为迭代器运行时构造其状态机,并且不应用与线性方法相同的路径覆盖集

语义是这样的,“一个没有生成的迭代器是空的,同时这也是对任何没有显式返回值的代码路径的有效替代”

理解这一点的关键在于编译器将构成迭代器的方法进行了改造,使代码不再具有未初始化的返回值。有关示例,请参见C#standard第10.4.4.1章


相关:

因为您使用的是收益率回报率。收益率-收益率法不是以收益率结束,而是以收益率中断结束,最后一次收益率中断可以省略

UPD。这是旧代码(Robotics Studio和Unity)的示例,其中存在最后一行的产量中断

@DavidG完全正确!我的签名是一个
IEnumerable
返回值,而不是一个
void
!这就是收益率回报的本质。检查来自微软的示例。如果指数为0,则它与您的指数相同。迭代器向不同的鼓手行进。不返回任何内容都很好,它返回一个空迭代器。@HansPassant非常好的解释,但是它在哪里说的呢?C语言规范,第10.4.4.1章。也就是说,你同意汉斯的观点吗?我们都同意这个规范。只有汉斯清楚地记住了这一点,我必须查一查。“最后一次收益率突破可以省略”-什么?不。那不对。我用2008年的书中的代码样本更新了答案。谢谢你发布答案。请注意,代码图片不受欢迎,因为无法复制/粘贴来尝试。你能更新你的答案吗?当这是公认的答案时,你如何限定“皱眉头”呢?第一个代码示例来自受版权保护的书籍,第二个由谷歌图像搜索创建。我记得十多年前,VisualStudio需要“产量突破”(我甚至不记得了——VisualStudio2005 Beta 2或RTM),所以这只是“历史”样本——在现代版的C语言中,这是不必要的。因此,我试图找到2005-2008年之前互联网上“收益中断”的例子:-)