使用带种子的 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
对象,因为我正在访问 Read
的 IsIndex
属性 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
来抑制此警告。
在以下代码中,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
对象,因为我正在访问 Read
的 IsIndex
属性 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
来抑制此警告。