dotnet/reactive · error · ArgumentNullException
Value cannot be null. (Parameter 'comparer')
Error message
Value cannot be null. (Parameter 'comparer')
What it means
Min<TSource>(source, comparer) requires a non-null comparer; the library throws ArgumentNullException('comparer') after validating source. Unlike the parameterless overload (which defaults to Comparer<T>.Default), this overload deliberately demands an explicit comparer.
Solutions
- Pass a concrete comparer; for default behavior use Comparer<TSource>.Default.
- Coalesce: comparer ?? Comparer<TSource>.Default.
- If no custom ordering is needed, use the parameterless source.Min() overload.
Example fix
// before var min = values.Min(possiblyNullComparer); // after var min = values.Min(possiblyNullComparer ?? Comparer<int>.Default);
Defensive patterns
Strategy: validation
Validate before calling
if (comparer == null) comparer = Comparer<TSource>.Default; var min = source.Min(comparer);
Type guard
static bool HasComparer<T>(IComparer<T>? c) => c is not null;
Try / catch
try { min = source.Min(comparer); }
catch (ArgumentNullException ex) when (ex.ParamName == "comparer") { min = source.Min(Comparer<TSource>.Default); } Prevention
- Default to Comparer<T>.Default when no custom comparer exists
- Don't pass null expecting default-comparer behavior in this API
- Validate DI/config-resolved comparers before use
When it happens
Trigger: Calling source.Min(null) or passing a comparer variable resolved to null (DI lookup failure, conditional construction, cached comparer never initialized).
Common situations: Factory/config-resolved comparers that return null; refactoring that removed a default comparer; passing null expecting BCL-style default-comparer behavior (e.g. mirroring older or different APIs that accept null).
Related errors
- Thrown when comparer is null (ArgumentNullException, param…
- Value cannot be null. (Parameter 'source')
- Value cannot be null. (Parameter 'func')
- Value cannot be null. (Parameter 'resultSelector')
- comparer
AI-assisted analysis of dotnet/reactive@94b5d5ab91 (2026-09-15).
Data as JSON: /api/errors/c4253392365e2cef.
Report an issue: GitHub.
Appendix: source
Thrown at Ix.NET/Source/System.Interactive/System/Linq/Operators/Min.cs:24
namespace System.Linq
{
public static partial class EnumerableEx
{
#if !(REFERENCE_ASSEMBLY && NET6_0_OR_GREATER)
/// <summary>
/// Returns the minimum value in the enumerable sequence by using the specified comparer to compare values.
/// </summary>
/// <typeparam name="TSource">Source sequence element type.</typeparam>
/// <param name="source">Source sequence.</param>
/// <param name="comparer">Comparer used to determine the minimum value.</param>
/// <returns>Minimum value in the sequence.</returns>
public static TSource Min<TSource>(this IEnumerable<TSource> source, IComparer<TSource> comparer)
{
if (source == null)
throw new ArgumentNullException(nameof(source));
if (comparer == null)
throw new ArgumentNullException(nameof(comparer));
return MinByWithTies(source, x => x, comparer).First();
}
#endif
}
}
View on GitHub (pinned to 94b5d5ab91)