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年之前互联网上“收益中断”的例子:-)