Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.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#_Yield - Fatal编程技术网

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集合中有哪些值