【发布时间】:2019-04-25 15:37:28
【问题描述】:
我在 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关键字!
【问题讨论】:
-
@DavidG 完全正确!我的签名承诺返回值
IEnumerable<string>,而不是void! -
这就是收益回报的本质。检查来自 Microsoft 的示例。 docs.microsoft.com/en-us/dotnet/csharp/language-reference/…指数为0,和你的一样。
-
迭代器向不同的鼓手前进。不返回任何东西就好了,它返回一个空的迭代器。
-
@HansPassant 很好的解释,但它是在哪里说的?
-
C# 语言规范,第 10.4.4.1 章。它并没有完全喊出来。
标签: c# .net visual-studio visual-studio-2017