当调用使用yield返回的方法时,错误“迭代器不能包含return语句” [英] Error 'Iterator cannot contain return statement ' when calling a method that returns using a yield

查看:561
本文介绍了当调用使用yield返回的方法时,错误“迭代器不能包含return语句”的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我希望有写这个方法与功放一个更好的方式;重载用更少的代码重复。我想在列表中返回三角洲项目之间的序列。此方法: -

 公共静态的IEnumerable<&小数GT; CalculateDeltas(这IEnumerable的<&小数GT序列)
{
十进制上一页=默认值(十进制);
的foreach(按顺序VAR项)
{
无功电流=项目;
十进制差异=当前 - 上一个;
上一个=项目;
收益率的回报差异;
}
}



作品就好。



然后我想到了一个重载允许一个绝对的增量,但如果绝对没有要求就调用原始的方法: -

 公共静态的IEnumerable<&小数GT; CalculateDeltas(这IEnumerable的<&小数GT序列,布尔绝对)
{
如果(绝对值)
{
十进制上一页=默认值(十进制);
的foreach(按顺序VAR项)
{
无功电流=项目;
十进制差异= Math.Abs​​(当前 - 上一个);
上一个=项目;
收益率的回报差异;
}
}
,否则
{
返回CalculateDeltas(序列);
}
}



但是,这并不编译,因为错误


不能返回从迭代器的值。使用收益回报
语句返回一个值,或产量突破结束迭代。




我有一个看的这个帖子并好像我不能做任何其他比从重复码原始的方法: -

 公共静态的IEnumerable<&小数GT; CalculateDeltas(这IEnumerable的<&小数GT序列,布尔绝对)
{
如果(绝对值)
{
十进制上一页=默认值(十进制);
的foreach(按顺序VAR项)
{
无功电流=项目;
十进制差异= Math.Abs​​(当前 - 上一个);
上一个=项目;
收益率的回报差异;
}
}
,否则
{
十进制上一页=默认值(十进制);
的foreach(按顺序VAR项)
{
无功电流=项目;
十进制差异=当前 - 上一个;
上一个=项目;
收益率的回报差异;
}
}
}



任何人都可以提出一个更好的办法这样做的?


解决方案

一个单一的方法不能同时收益回报率收益。你必须选择一个或另一个。



您既可以做一个的foreach 收益率返回清单:

 别的
{
的foreach(在VAR项目CalculateDeltas(序列))
收益回报的项目;
}

或者你的代码分成两种方法:

 如果(绝对值)
返回CalculateAbsoluteDeltas(序列);
,否则
返回CalculateDeltas(序列);


I'm hoping there's a nicer way to write this method & overloads with less code duplication. I want to return a sequence of deltas between items in a list. this method:-

    public static IEnumerable<decimal> CalculateDeltas(this IEnumerable<decimal> sequence)
    {
        decimal prev = default(decimal);
        foreach (var item in sequence)
        {
            var current = item;
            decimal diff = current - prev;
            prev = item;
            yield return diff;
        }
    }

works just fine.

I then thought about an overload which would allow an absolute delta, but would call the original method if absolute wasn't required:-

    public static IEnumerable<decimal> CalculateDeltas(this IEnumerable<decimal> sequence,bool absolute)
    {
        if (absolute)
        {
            decimal prev = default(decimal);
            foreach (var item in sequence)
            {
                var current = item;
                decimal diff = Math.Abs(current - prev);
                prev = item;
                yield return diff;
            }
        }
        else
        {
            return CalculateDeltas(sequence);
        }
    }

but this doesn't compile because of Error

"Cannot return a value from an iterator. Use the yield return statement to return a value, or yield break to end the iteration."

I've had a look at this post and it seems like I won't be able to do anything other than repeating the code from the original method:-

    public static IEnumerable<decimal> CalculateDeltas(this IEnumerable<decimal> sequence,bool absolute)
    {
        if (absolute)
        {
            decimal prev = default(decimal);
            foreach (var item in sequence)
            {
                var current = item;
                decimal diff = Math.Abs(current - prev);
                prev = item;
                yield return diff;
            }
        }
        else
        {
            decimal prev = default(decimal);
            foreach (var item in sequence)
            {
                var current = item;
                decimal diff = current - prev;
                prev = item;
                yield return diff;
            }
        }
    }

Can anyone suggest a better way of doing this?

解决方案

A single method cannot both yield return and return. You must choose one or the other.

You can either do a foreach to yield return the list:

else
{
    foreach (var item in CalculateDeltas(sequence))
        yield return item;
}

Or separate your code into two methods:

if (absolute)
    return CalculateAbsoluteDeltas(sequence);
else
    return CalculateDeltas(sequence);

这篇关于当调用使用yield返回的方法时,错误“迭代器不能包含return语句”的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆