c# - 使用带种子的 LINQ 聚合,Resharper 声称表达式始终为假

标签 c# linq resharper aggregate

在以下代码中,Resharper 声称表达式 currMax == null 始终为 false。

public Read Read1
{
    get
    {
        return Reads.Where(read => !read.IsIndex)
                    .Aggregate((Read)null, (currMax, read) => currMax == null || read.Length > currMax.Length ? read : currMax);
    }
}

当对 Aggregate 的调用中的 lambda 表达式的第一次迭代执行时,我希望 currMax == null 为真,因为 (Read)null 是种子。 Resharper 知道上游 Where 在生成的 IEnumerable 中需要非空的 Read 对象,因为我正在访问 IsIndex Read 类的属性。 resharper 是否只是不考虑 Aggregate 的种子参数?

编辑:我在这里提交了错误报告 https://youtrack.jetbrains.com/issue/RSRP-443055

最佳答案

从 ILSpy 中 Aggregate 的反汇编来看,ReSharper 似乎是错误的。

public static TAccumulate Aggregate<TSource, TAccumulate>(
    this IEnumerable<TSource> source, 
    TAccumulate seed, 
    Func<TAccumulate, TSource, TAccumulate> func)
{
    if (source == null)
    {
        throw Error.ArgumentNull("source");
    }
    if (func == null)
    {
        throw Error.ArgumentNull("func");
    }
    TAccumulate tAccumulate = seed;
    foreach (TSource current in source)
    {
        tAccumulate = func(tAccumulate, current);
    }
    return tAccumulate;
}

明确删除 null 检查将导致空引用异常。

关于c# - 使用带种子的 LINQ 聚合,Resharper 声称表达式始终为假,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31062230/

相关文章:

c# - 使用 XSD 验证文本文件(不是 XML)?

c# - DevExpress 日期时间选择器

c# - 如何获得不同的元素?

c# - 我如何从一个集合转换为另一个集合

c# - 如何在 C# 中的 XML 文档注释之间跳转?

c# - MessageBox 不推荐在 MVVM 应用中使用?

c# - 是否只有在条件为真时才从函数返回的单行语句?

c# - 如何强制 Linq 更新一行的上次编辑时间?

javascript - Visual Studio 2013 JavaScript/TypeScript 奇怪的缩进行为

javascript - 使用 resharper 调试 jasmine 2.0 测试