l--*_*''' 2 .net c# 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());
}
Run Code Online (Sandbox Code Playgroud)
return最后一行没有关键字!
这是与IEnumerable迭代器模式和yield return关键字相关的异常.在这种情况下,编译器为迭代器运行时构造其状态机,并且不应用与线性方法相同的路径覆盖集.
语义是"一个不生成的迭代器,是空的,这同时是对任何代码路径的有效替换,它不会明确地返回一个值".
理解这一点的关键是编译器改进构成迭代器的方法,以及不再具有未初始化返回值的代码.有关示例,请参阅C#标准章节10.4.4.1.
相关:https://stackoverflow.com/a/9631242/1132334
| 归档时间: |
|
| 查看次数: |
95 次 |
| 最近记录: |