Browse Source

Change signature of Observable.DefaultIfEmpty to a IObservable<TSource?> return type.

There's a warning suppression which I think is fine in this case.
Daniel Weber 5 years ago
parent
commit
7d8ee67837

+ 1 - 1
Rx.NET/Source/src/System.Reactive/Linq/IQueryLanguage.cs

@@ -584,7 +584,7 @@ namespace System.Reactive.Linq
         #region * StandardSequenceOperators *
 
         IObservable<TResult> Cast<TResult>(IObservable<object> source);
-        IObservable<TSource> DefaultIfEmpty<TSource>(IObservable<TSource> source);
+        IObservable<TSource?> DefaultIfEmpty<TSource>(IObservable<TSource> source);
         IObservable<TSource> DefaultIfEmpty<TSource>(IObservable<TSource> source, TSource defaultValue);
         IObservable<TSource> Distinct<TSource>(IObservable<TSource> source);
         IObservable<TSource> Distinct<TSource>(IObservable<TSource> source, IEqualityComparer<TSource> comparer);

+ 1 - 1
Rx.NET/Source/src/System.Reactive/Linq/Observable.StandardSequenceOperators.cs

@@ -42,7 +42,7 @@ namespace System.Reactive.Linq
         /// <param name="source">The sequence to return a default value for if it is empty.</param>
         /// <returns>An observable sequence that contains the default value for the TSource type if the source is empty; otherwise, the elements of the source itself.</returns>
         /// <exception cref="ArgumentNullException"><paramref name="source"/> is null.</exception>
-        public static IObservable<TSource> DefaultIfEmpty<TSource>(this IObservable<TSource> source)
+        public static IObservable<TSource?> DefaultIfEmpty<TSource>(this IObservable<TSource> source)
         {
             if (source == null)
             {

+ 7 - 7
Rx.NET/Source/src/System.Reactive/Linq/Observable/DefaultIfEmpty.cs

@@ -4,27 +4,27 @@
 
 namespace System.Reactive.Linq.ObservableImpl
 {
-    internal sealed class DefaultIfEmpty<TSource> : Producer<TSource, DefaultIfEmpty<TSource>._>
+    internal sealed class DefaultIfEmpty<TSource> : Producer<TSource?, DefaultIfEmpty<TSource>._>
     {
         private readonly IObservable<TSource> _source;
-        private readonly TSource _defaultValue;
+        private readonly TSource? _defaultValue;
 
-        public DefaultIfEmpty(IObservable<TSource> source, TSource defaultValue)
+        public DefaultIfEmpty(IObservable<TSource> source, TSource? defaultValue)
         {
             _source = source;
             _defaultValue = defaultValue;
         }
 
-        protected override _ CreateSink(IObserver<TSource> observer) => new _(_defaultValue, observer);
+        protected override _ CreateSink(IObserver<TSource?> observer) => new _(_defaultValue, observer);
 
         protected override void Run(_ sink) => sink.Run(_source);
 
-        internal sealed class _ : IdentitySink<TSource>
+        internal sealed class _ : Sink<TSource, TSource?>
         {
-            private readonly TSource _defaultValue;
+            private readonly TSource? _defaultValue;
             private bool _found;
 
-            public _(TSource defaultValue, IObserver<TSource> observer)
+            public _(TSource? defaultValue, IObserver<TSource?> observer)
                 : base(observer)
             {
                 _defaultValue = defaultValue;

+ 4 - 2
Rx.NET/Source/src/System.Reactive/Linq/QueryLanguage.StandardSequenceOperators.cs

@@ -24,14 +24,16 @@ namespace System.Reactive.Linq
 
         #region + DefaultIfEmpty +
 
-        public virtual IObservable<TSource> DefaultIfEmpty<TSource>(IObservable<TSource> source)
+        public virtual IObservable<TSource?> DefaultIfEmpty<TSource>(IObservable<TSource> source)
         {
-            return new DefaultIfEmpty<TSource>(source, default!);
+            return new DefaultIfEmpty<TSource>(source, default);
         }
 
         public virtual IObservable<TSource> DefaultIfEmpty<TSource>(IObservable<TSource> source, TSource defaultValue)
         {
+#pragma warning disable CS8619 // Nullability of reference types in value doesn't match target type.
             return new DefaultIfEmpty<TSource>(source, defaultValue);
+#pragma warning restore CS8619 // Nullability of reference types in value doesn't match target type.
         }
 
         #endregion

+ 1 - 1
Rx.NET/Source/tests/Tests.System.Reactive.ApiApprovals/Api/ApiApprovalTests.Core.verified.cs

@@ -986,7 +986,7 @@ namespace System.Reactive.Linq
         public static System.IObservable<TResult> Create<TResult>(System.Func<System.IObserver<TResult>, System.Threading.CancellationToken, System.Threading.Tasks.Task> subscribeAsync) { }
         public static System.IObservable<TResult> Create<TResult>(System.Func<System.IObserver<TResult>, System.Threading.CancellationToken, System.Threading.Tasks.Task<System.Action>> subscribeAsync) { }
         public static System.IObservable<TResult> Create<TResult>(System.Func<System.IObserver<TResult>, System.Threading.CancellationToken, System.Threading.Tasks.Task<System.IDisposable>> subscribeAsync) { }
-        public static System.IObservable<TSource> DefaultIfEmpty<TSource>(this System.IObservable<TSource> source) { }
+        public static System.IObservable<TSource?> DefaultIfEmpty<TSource>(this System.IObservable<TSource> source) { }
         public static System.IObservable<TSource> DefaultIfEmpty<TSource>(this System.IObservable<TSource> source, TSource defaultValue) { }
         public static System.IObservable<TResult> Defer<TResult>(System.Func<System.IObservable<TResult>> observableFactory) { }
         public static System.IObservable<TResult> Defer<TResult>(System.Func<System.Threading.Tasks.Task<System.IObservable<TResult>>> observableFactoryAsync) { }