使用LINQ Aggregate with seed,Resharper声明表达式始终为false

时间:2015-06-25 23:02:44

标签: 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在结果Read中需要非空IEnumerable个对象,因为我正在访问IsIndex类的Read属性。 resharper是否不考虑Aggregate的种子参数?

编辑:我已在https://youtrack.jetbrains.com/issue/RSRP-443055

提交了错误报告

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

在此期间,您可以使用// ReSharper disable once ConditionIsAlwaysTrueOrFalse停止此警告。