dotnet/reactive · error · ArgumentNullException
Value cannot be null. (Parameter 'observer')
Error message
Value cannot be null. (Parameter 'observer')
What it means
The AsyncObserver.Repeat(observer, value) factory (used to build async observers) requires a non-null IAsyncObserver<TSource> and throws ArgumentNullException with Parameter 'observer' when violated. Custom operator authors calling these low-level AsyncObserver factories must supply the downstream observer they were handed.
Solutions
- Pass the observer instance supplied to your SubscribeAsync/Subscribe implementation
- Check DI/factory wiring that should have provided the observer
- Ensure your custom operator forwards the observer parameter rather than dropping it
- If constructing standalone, create an observer (e.g. via AsyncObserver.Create) instead of passing null
Example fix
// before
public ValueTask<IAsyncDisposable> SubscribeAsync(IAsyncObserver<int> observer)
=> AsyncObserver.Repeat(null, 42);
// after
public ValueTask<IAsyncDisposable> SubscribeAsync(IAsyncObserver<int> observer)
=> AsyncObserver.Repeat(observer, 42); Defensive patterns
Strategy: validation
Validate before calling
if (observer is null) throw new ArgumentNullException(nameof(observer)); var disp = await AsyncObserver.Repeat(observer, value);
Type guard
bool IsValidObserver<TSource>(IAsyncObserver<TSource> o) => o is not null;
Try / catch
try { var disp = await AsyncObserver.Repeat(observer, value); }
catch (ArgumentNullException ex) when (ex.ParamName == "observer")
{
// forward the real observer from Subscribe instead of null
} Prevention
- In custom operators, always forward the observer argument from Subscribe/SubscribeAsync
- Never construct observers as standalone calls with null; use AsyncObserver.Create
- Check DI registration for observer dependencies
- Keep operator plumbing symmetric: pass through every parameter you receive
When it happens
Trigger: Implementing a custom async operator and calling AsyncObserver.Repeat(observer, value) or AsyncObserver.Repeat(observer, value, scheduler) with a null observer — typically because the custom SubscribeAsync implementation did not receive or forward a valid observer.
Common situations: Writing custom Rx operators; wiring observers through DI where the dependency was not registered; calling the observer factory outside a Subscribe pipeline where no observer exists.
Related errors
- Value cannot be null. (Parameter 'source')
- Value cannot be null. (Parameter 'observer')
- Value cannot be null. (Parameter 'disposable1')
- Value cannot be null. (Parameter 'disposable2')
- Value cannot be null. (Parameter 'onNextAsync')
AI-assisted analysis of dotnet/reactive@94b5d5ab91 (2026-09-15).
Data as JSON: /api/errors/77919a559bc903be.
Report an issue: GitHub.
Appendix: source
Thrown at AsyncRx.NET/System.Reactive.Async/Linq/Operators/Repeat.cs:73
{
if (source == null)
throw new ArgumentNullException(nameof(source));
if (repeatCount < 0)
throw new ArgumentNullException(nameof(repeatCount));
return CreateAsyncObservable<TSource>.From(
source,
repeatCount,
static (source, repeatCount, observer) => AsyncObserver.Repeat(observer, source, repeatCount));
}
}
public partial class AsyncObserver
{
public static ValueTask<IAsyncDisposable> Repeat<TSource>(IAsyncObserver<TSource> observer, TSource value)
{
if (observer == null)
throw new ArgumentNullException(nameof(observer));
return Repeat(observer, value, TaskPoolAsyncScheduler.Default);
}
public static ValueTask<IAsyncDisposable> Repeat<TSource>(IAsyncObserver<TSource> observer, TSource value, IAsyncScheduler scheduler)
{
if (observer == null)
throw new ArgumentNullException(nameof(observer));
if (scheduler == null)
throw new ArgumentNullException(nameof(scheduler));
return scheduler.ScheduleAsync(async ct =>
{
while (!ct.IsCancellationRequested)
{
await observer.OnNextAsync(value).RendezVous(scheduler, ct);
}
});View on GitHub (pinned to 94b5d5ab91)