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

  1. Pass a concrete comparer; for default behavior use Comparer<TSource>.Default.
  2. Coalesce: comparer ?? Comparer<TSource>.Default.
  3. 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

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


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)