c# – 语法问题使用yield return的IEnumerable方法

这是我的方法
static IEnumerable<DateTime> GetMonths(DateTime from,DateTime to)
{
    // if logs is not uptodate
    TimeSpan logsMissingTimespan = to - from;

    if (logsMissingTimespan != new TimeSpan(0))
    {
        return GetMonthsBetweenTwoDates(from,to);
    }

    return null; // Why this line ?
}

private static IEnumerable<DateTime> GetMonthsBetweenTwoDates(DateTime from,DateTime to)
{

    DateTime date = from;
    DateTime lastDate = DateTime.MaxValue;

    while (date < to)
    {
        if (lastDate.Month != date.Month)
        {
            lastDate = date;
            yield return lastDate;
        }
        date = date.AddDays(1);
    }
}

它工作正常,但我想我可以写一些像这样清洁的东西:

static IEnumerable<DateTime> GetMonths(DateTime from,DateTime to)
{
    TimeSpan logsMissingTimespan = to - from;

    if (logsMissingTimespan == new TimeSpan(0))
    {
        yield break;
    }

    return GetMonthsBetweenTwoDates(from,to);
}

但是我有一条错误消息:

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

为什么我应该返回null并且语法正确?

编辑:

所以,正确的方法是使用Enumerable.Empty:

static IEnumerable<DateTime> GetMonths(DateTime from,to);
    }

    return Enumerable.Empty<DateTime>();
}

解决方法

前两个示例的形式产生不同类型的输出.

您的第一个示例返回IEnumerable< T>如果条件满足则直接,如果不满足则为空引用.您的第二个示例始终返回IEnumerable< T>,但条件确定它是否具有任何元素.

第二个例子是使用迭代器块完成的. C#编译器使用yield语法将您编写的函数转换为实现IEnumerable< T>的自定义(隐藏)类型.和实现IEnumerator< T>的类型.这些类型实现了必要的状态机,以实现(希望)您放入函数的逻辑.因此,你不能混淆范式;你必须要么返回IEnumerable< T>的实例.来自函数(并且根本不使用yield),或者必须通过yield返回所有内容.

如果你所关心的是你正在返回一个空引用的事实,你可以通过返回Enumerable.Empty< DateTime>来使方法在语义上相同.而不是null.

相关文章

在项目中使用SharpZipLib压缩文件夹的时候,遇到如果目录较深,则压缩包中的文件夹同样比较深的问题。比...
项目需要,几十万张照片需要计算出每个照片的特征值(调用C++编写的DLL)。 业务流程:选择照片...
var array = new byte[4]; var i = Encoding.UTF8.GetBytes(100.ToString(&quot;x2&quot;));//...
其实很简单,因为Combox的Item是一个K/V的object,那么就可以把它的items转换成IEnumerable&lt;Dic...
把.net4.6安装包打包进安装程序。 关键脚本如下: 头部引用字符串对比库 !include &quot;WordFunc....
项目需求(Winform)可以批量打印某个模板,经过百度和摸索,使用iTextSharp+ZXing.NetʿreeSp...