{"record":{"id":"d4b5344291ff57a9","repo":"dotnet/reactive","slug":"observer-takelast","errorCode":null,"errorMessage":"observer","messagePattern":"observer","errorType":"validation","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"AsyncRx.NET/System.Reactive.Async/Linq/Operators/TakeLast.cs","lineNumber":157,"sourceCode":"                    var (sink, drain) = AsyncObserver.TakeLast(observer, state.duration, state.clock, state.scheduler);\n\n                    var subscription = await source.SubscribeSafeAsync(sink).ConfigureAwait(false);\n\n                    return StableCompositeAsyncDisposable.Create(subscription, drain);\n                });\n        }\n\n        public static IAsyncObservable<TSource> TakeLast<TSource>(this IAsyncObservable<TSource> source, TimeSpan duration, IAsyncScheduler scheduler) => TakeLast(source, duration, scheduler, scheduler);\n    }\n\n    public partial class AsyncObserver\n    {\n        public static (IAsyncObserver<TSource>, IAsyncDisposable) TakeLast<TSource>(IAsyncObserver<TSource> observer, int count) => TakeLast(observer, count, TaskPoolAsyncScheduler.Default);\n\n        public static (IAsyncObserver<TSource>, IAsyncDisposable) TakeLast<TSource>(IAsyncObserver<TSource> observer, int count, IAsyncScheduler scheduler)\n        {\n            if (observer == null)\n                throw new ArgumentNullException(nameof(observer));\n            if (count <= 0)\n                throw new ArgumentOutOfRangeException(nameof(count));\n            if (scheduler == null)\n                throw new ArgumentNullException(nameof(scheduler));\n\n            var sad = new SingleAssignmentAsyncDisposable();\n\n            var queue = new Queue<TSource>();\n\n            return\n                (\n                    Create<TSource>(\n                        x =>\n                        {\n                            queue.Enqueue(x);\n\n                            if (queue.Count > count)\n                            {","sourceCodeStart":139,"sourceCodeEnd":175,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/AsyncRx.NET/System.Reactive.Async/Linq/Operators/TakeLast.cs#L139-L175","documentation":"The TakeLast<TSource>(observer, count) operator validates its observer argument first and throws ArgumentNullException when null is passed. AsyncRx operators build an observer pipeline, so a null downstream observer cannot be wired up. This is a fail-fast guard thrown synchronously at operator construction.","triggerScenarios":"Calling AsyncObserver.TakeLast(null, 5) or TakeLast(null, 5, scheduler), e.g. when the observer comes from a failed factory method or an uninitialized field.","commonSituations":"Chaining operators where an earlier factory returned null; passing a result of a conditional expression that evaluated to null; refactoring where the observer variable lost its assignment.","solutions":["Pass a non-null IAsyncObserver<TSource> instance as the first argument.","Check where the observer value originates and fix the upstream null producer.","Add a null check before calling TakeLast to fail with a clearer stack trace at the call site."],"exampleFix":"// before\nIAsyncObserver<int> obs = GetObserver(); // may return null\nvar op = AsyncObserver.TakeLast(obs, 3);\n// after\nvar obs = GetObserver() ?? throw new InvalidOperationException(\"observer required\");\nvar op = AsyncObserver.TakeLast(obs, 3);","handlingStrategy":"validation","validationCode":"if (observer is null) throw new ArgumentNullException(nameof(observer));\nAsyncObserver.TakeLast(observer, count);","typeGuard":"bool IsValidObs<TSource>(IAsyncObserver<TSource> o) => o is not null;","tryCatchPattern":"try { var op = AsyncObserver.TakeLast(observer, count); }\ncatch (ArgumentNullException ex) when (ex.ParamName == \"observer\") { /* supply default observer */ }","preventionTips":["Never let observer-producing helpers return null; return Empty pipelines instead.","Enable nullable reference types so null observer flows are caught at compile time.","Validate composed pipeline inputs once at the boundary."],"tags":["argument-null","asyncrx","takelast","argument-validation"],"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"}