Resharper声称使用带有种子的LINQ Aggregate表达式总是错误的

本文关键字:Aggregate LINQ 表达式 错误 种子 Resharper | 更新日期: 2023-09-27 17:59:53

在下面的代码中,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对象,因为我正在访问Read类的IsIndex属性。重拍只是没有考虑到Aggregate的种子参数吗?

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

Resharper声称使用带有种子的LINQ Aggregate表达式总是错误的

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

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

同时,您可以使用// ReSharper disable once ConditionIsAlwaysTrueOrFalse抑制此警告。