{"record":{"id":"1ebfca767029086e","repo":"dotnet/reactive","slug":"value-cannot-be-null-parameter-disposables-1ebfca","errorCode":null,"errorMessage":"Value cannot be null. (Parameter 'disposables')","messagePattern":"Value cannot be null\\. \\(Parameter 'disposables'\\)","errorType":"exception","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"AsyncRx.NET/System.Reactive.Async/Disposables/StableCompositeAsyncDisposable.cs","lineNumber":26,"sourceCode":"\nnamespace System.Reactive.Disposables\n{\n    public abstract class StableCompositeAsyncDisposable : IAsyncDisposable\n    {\n        public static StableCompositeAsyncDisposable Create(IAsyncDisposable disposable1, IAsyncDisposable disposable2)\n        {\n            if (disposable1 == null)\n                throw new ArgumentNullException(nameof(disposable1));\n            if (disposable2 == null)\n                throw new ArgumentNullException(nameof(disposable2));\n\n            return new Binary(disposable1, disposable2);\n        }\n\n        public static StableCompositeAsyncDisposable Create(params IAsyncDisposable[] disposables)\n        {\n            if (disposables == null)\n                throw new ArgumentNullException(nameof(disposables));\n\n            return new NAry(disposables);\n        }\n\n        public static StableCompositeAsyncDisposable Create(IEnumerable<IAsyncDisposable> disposables)\n        {\n            if (disposables == null)\n                throw new ArgumentNullException(nameof(disposables));\n\n            return new NAry(disposables);\n        }\n\n        public abstract ValueTask DisposeAsync();\n\n        private sealed class Binary : StableCompositeAsyncDisposable\n        {\n            private volatile IAsyncDisposable _disposable1;\n            private volatile IAsyncDisposable _disposable2;","sourceCodeStart":8,"sourceCodeEnd":44,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/AsyncRx.NET/System.Reactive.Async/Disposables/StableCompositeAsyncDisposable.cs#L8-L44","documentation":"The params-array overload StableCompositeAsyncDisposable.Create(params IAsyncDisposable[] disposables) rejects a null array via ArgumentNullException. The library validates inputs at creation so DisposeAsync later never sees a null set.","triggerScenarios":"Calling Create((IAsyncDisposable[])null) — usually when a null array variable or a method returning null is passed to the params overload.","commonSituations":"Passing an array from configuration or another method that returned null; explicit cast to disambiguate overloads hitting the array overload with null; refactors renaming the array variable.","solutions":["Pass a non-null array (use Array.Empty<IAsyncDisposable>() if there are none).","Fix the source of the array so it never returns null.","If items themselves may be null, filter them: disposables.Where(d => d != null).ToArray()."],"exampleFix":"// before\nvar arr = GetDisposables(); // may return null\nvar composite = StableCompositeAsyncDisposable.Create(arr);\n// after\nvar arr = GetDisposables() ?? Array.Empty<IAsyncDisposable>();\nvar composite = StableCompositeAsyncDisposable.Create(arr);","handlingStrategy":"validation","validationCode":"if (disposables is null) disposables = Array.Empty<IAsyncDisposable>();\nvar composite = StableCompositeAsyncDisposable.Create(disposables);","typeGuard":"static bool IsDisposableArray(IAsyncDisposable[]? a) => a is not null;","tryCatchPattern":"try { var c = StableCompositeAsyncDisposable.Create(arr); }\ncatch (ArgumentNullException ex) when (ex.ParamName == \"disposables\")\n{ arr = Array.Empty<IAsyncDisposable>(); }","preventionTips":["Return Array.Empty<T>() instead of null from methods producing arrays.","Enable nullable reference type analysis to catch null arrays at compile time.","Validate configuration collections at startup."],"tags":["argument-null","disposables","params-array"],"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"}