C# 异步方法不识别收益率返回方法?
问题 当我尝试在异步方法中调用我的普通方法时,调试器会忽略它 这是我的异步方法C# 异步方法不识别收益率返回方法?,c#,yield,C#,Yield,问题 当我尝试在异步方法中调用我的普通方法时,调试器会忽略它 这是我的异步方法 internal async static Task<DefinitionsModel> DeserializeAsync(this string path) { var model = new DefinitionsModel(); var content = await File.ReadAllTextAsync(path); model.Page
internal async static Task<DefinitionsModel> DeserializeAsync(this string path)
{
var model = new DefinitionsModel();
var content = await File.ReadAllTextAsync(path);
model.Pages = content.GetPages();
return model;
}
这是我的常规方法
private static IEnumerable<PageModel> GetPages(this string content)
{
var level = 0;
var value = nameof(PageModel.Page).GetDElement<PageModel>();
var start_with_line = $"{level} {value} ";
var end_with_line = string.Concat(Enumerable.Repeat(Environment.NewLine, 2));
var expression = $@"\b{start_with_line}\S * {end_with_line}\b";
var matches = content.GetPagesFromContent(expression);
yield return new PageModel();
}
助手图片
收益只有经过枚举才能产生。在这种情况下:
model.Pages = content.GetPages();
没有枚举。但是,您可以这样做:
model.Pages = content.GetPages().ToList();
通过使用foreach语句或LINQ查询使用迭代器方法,毫不奇怪ToList使用foreach迭代IEnumerable
尽管说实话,我正在努力弄清楚您在做什么,但很可能需要重新思考GetPage
在语句中使用yield上下文关键字时,可以指示
它出现在其中的方法、运算符或get访问器是
迭代器。使用yield定义迭代器就不需要
explicit extra class保存对象状态的类
枚举,请参见IEnumerator以获取实现
自定义集合类型的IEnumerable和IEnumerator模式
使用yield-return语句一次返回一个元素
您可以使用forelink迭代器语句来使用forelink迭代器语句
查询foreach循环的每次迭代都调用迭代器方法。
在迭代器方法中到达yield return语句时,
返回表达式,并保留代码中的当前位置。
下次执行时,将从该位置重新启动执行
调用迭代器函数
收益只有经过枚举才能产生。在这种情况下:
model.Pages = content.GetPages();
没有枚举。但是,您可以这样做:
model.Pages = content.GetPages().ToList();
通过使用foreach语句或LINQ查询使用迭代器方法,毫不奇怪ToList使用foreach迭代IEnumerable
尽管说实话,我正在努力弄清楚您在做什么,但很可能需要重新思考GetPage
在语句中使用yield上下文关键字时,可以指示
它出现在其中的方法、运算符或get访问器是
迭代器。使用yield定义迭代器就不需要
explicit extra class保存对象状态的类
枚举,请参见IEnumerator以获取实现
自定义集合类型的IEnumerable和IEnumerator模式
使用yield-return语句一次返回一个元素
通过使用foreach语句或LINQ使用迭代器方法
查询foreach循环的每次迭代都调用迭代器方法。
在迭代器方法中到达yield return语句时,
返回表达式,并保留代码中的当前位置。
下次执行时,将从该位置重新启动执行
调用迭代器函数
GetPages方法返回IEnumerable和yield返回。编译器根据该代码构建一个状态机
只有在使用GetEnumerator方法从生成的状态机获取的枚举数被调用和迭代后,才会执行该代码。GetPages方法返回IEnumerable,并返回yield。编译器根据该代码构建一个状态机
只有在使用GetEnumerator方法从生成的状态机获取的枚举数被调用和迭代后,才会执行该代码。这可能是因为IEnumerable结果没有被迭代/持久化。例如,您的方法在foreach循环中使用时被执行。@phuzi我的问题不是关于List vs IEnumable…有一个带有单个yield语句的方法真的很奇怪,为什么不只返回一个PageModel?我同意标题有误导性,但那里的解释实际上非常有用@OverZer0@DavidG我还没有完成我的方法,我只是想看看哪些值具有mathes集合,这可能是因为IEnumerable结果没有被迭代/持久化。例如,您的方法在foreach循环中使用时被执行。@phuzi我的问题不是关于List vs IEnumable…有一个带有单个yield语句的方法真的很奇怪,为什么不只返回一个PageModel?我同意标题有误导性,但那里的解释实际上非常有用@OverZer0@DavidG我还没有完成我的方法,我只是想看看mathes集合中有哪些值