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

Resharper claims expression is always false using LINQ Aggregate with seed

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

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 对象,因为我正在访问 ReadIsIndex 属性 class。 resharper 是否只是不考虑 Aggregate 的种子参数?

编辑:我已在此处提交错误报告 https://youtrack.jetbrains.com/issue/RSRP-443055

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

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 检查将导致空引用异常。

这确实是 ReSharper 的可空性分析中的一个错误。你能向 YouTrack 报告吗?

在此期间,您可以使用 // ReSharper disable once ConditionIsAlwaysTrueOrFalse 来抑制此警告。