{"record":{"id":"c4253392365e2cef","repo":"dotnet/reactive","slug":"value-cannot-be-null-parameter-comparer-c42533","errorCode":null,"errorMessage":"Value cannot be null. (Parameter 'comparer')","messagePattern":"Value cannot be null\\. \\(Parameter 'comparer'\\)","errorType":"exception","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"Ix.NET/Source/System.Interactive/System/Linq/Operators/Min.cs","lineNumber":24,"sourceCode":"\nnamespace System.Linq\n{\n    public static partial class EnumerableEx\n    {\n#if !(REFERENCE_ASSEMBLY && NET6_0_OR_GREATER)\n        /// <summary>\n        /// Returns the minimum value in the enumerable sequence by using the specified comparer to compare values.\n        /// </summary>\n        /// <typeparam name=\"TSource\">Source sequence element type.</typeparam>\n        /// <param name=\"source\">Source sequence.</param>\n        /// <param name=\"comparer\">Comparer used to determine the minimum value.</param>\n        /// <returns>Minimum value in the sequence.</returns>\n        public static TSource Min<TSource>(this IEnumerable<TSource> source, IComparer<TSource> comparer)\n        {\n            if (source == null)\n                throw new ArgumentNullException(nameof(source));\n            if (comparer == null)\n                throw new ArgumentNullException(nameof(comparer));\n\n            return MinByWithTies(source, x => x, comparer).First();\n        }\n#endif\n    }\n}\n","sourceCodeStart":6,"sourceCodeEnd":31,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/Ix.NET/Source/System.Interactive/System/Linq/Operators/Min.cs#L6-L31","documentation":"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.","triggerScenarios":"Calling source.Min(null) or passing a comparer variable resolved to null (DI lookup failure, conditional construction, cached comparer never initialized).","commonSituations":"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).","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."],"exampleFix":"// before\nvar min = values.Min(possiblyNullComparer);\n// after\nvar min = values.Min(possiblyNullComparer ?? Comparer<int>.Default);","handlingStrategy":"validation","validationCode":"if (comparer == null) comparer = Comparer<TSource>.Default;\nvar min = source.Min(comparer);","typeGuard":"static bool HasComparer<T>(IComparer<T>? c) => c is not null;","tryCatchPattern":"try { min = source.Min(comparer); }\ncatch (ArgumentNullException ex) when (ex.ParamName == \"comparer\") { min = source.Min(Comparer<TSource>.Default); }","preventionTips":["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"],"tags":["null-argument","linq","min","icomparer"],"backgroundTag":"null-argument","analyzedSha":"94b5d5ab912789f5abe9a72138a25bbd716fe59c","analyzedAt":"2026-09-15T02:26:24.759Z","contentChangedAt":"2026-09-15T02:26:24.759Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}