Răsfoiți Sursa

Enable #nullable for FromEvent.

Bart De Smet 5 ani în urmă
părinte
comite
e72dec1393

+ 3 - 3
Rx.NET/Source/src/System.Reactive/EventPattern.cs

@@ -17,7 +17,7 @@ namespace System.Reactive
         /// </summary>
         /// <param name="sender">The sender object that raised the event.</param>
         /// <param name="e">The event data that was generated by the event.</param>
-        public EventPattern(object sender, TEventArgs e)
+        public EventPattern(object? sender, TEventArgs e)
             : base(sender, e)
         {
         }
@@ -35,7 +35,7 @@ namespace System.Reactive
         /// </summary>
         /// <param name="sender">The sender object that raised the event.</param>
         /// <param name="e">The event data that was generated by the event.</param>
-        public EventPattern(TSender sender, TEventArgs e)
+        public EventPattern(TSender? sender, TEventArgs e)
         {
             Sender = sender;
             EventArgs = e;
@@ -44,7 +44,7 @@ namespace System.Reactive
         /// <summary>
         /// Gets the sender object that raised the event.
         /// </summary>
-        public TSender Sender { get; }
+        public TSender? Sender { get; }
 
         /// <summary>
         /// Gets the event data that was generated by the event.

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

@@ -20,7 +20,7 @@ namespace System.Reactive
         /// <summary>
         /// Gets the sender object that raised the event.
         /// </summary>
-        TSender Sender { get; }
+        TSender? Sender { get; }
 
         /// <summary>
         /// Gets the event data that was generated by the event.

+ 4 - 14
Rx.NET/Source/src/System.Reactive/Linq/Observable/FromEvent.cs

@@ -2,9 +2,6 @@
 // The .NET Foundation licenses this file to you under the MIT License.
 // See the LICENSE file in the project root for more information. 
 
-#nullable disable
-
-using System.Diagnostics;
 using System.Reactive.Concurrency;
 using System.Reactive.Disposables;
 using System.Reactive.Subjects;
@@ -162,7 +159,7 @@ namespace System.Reactive.Linq.ObservableImpl
 {
     internal sealed class FromEvent<TDelegate, TEventArgs> : ClassicEventProducer<TDelegate, TEventArgs>
     {
-        private readonly Func<Action<TEventArgs>, TDelegate> _conversion;
+        private readonly Func<Action<TEventArgs>, TDelegate>? _conversion;
 
         public FromEvent(Action<TDelegate> addHandler, Action<TDelegate> removeHandler, IScheduler scheduler)
             : base(addHandler, removeHandler, scheduler)
@@ -206,7 +203,7 @@ namespace System.Reactive.Linq.ObservableImpl
         protected abstract TDelegate GetHandler(Action<TArgs> onNext);
         protected abstract IDisposable AddHandler(TDelegate handler);
 
-        private Session _session;
+        private Session? _session;
 
         protected override IDisposable Run(IObserver<TArgs> observer)
         {
@@ -237,8 +234,8 @@ namespace System.Reactive.Linq.ObservableImpl
         {
             private readonly EventProducer<TDelegate, TArgs> _parent;
             private readonly Subject<TArgs> _subject;
+            private readonly SingleAssignmentDisposable _removeHandler = new SingleAssignmentDisposable();
 
-            private SingleAssignmentDisposable _removeHandler;
             private int _count;
 
             public Session(EventProducer<TDelegate, TArgs> parent)
@@ -308,13 +305,6 @@ namespace System.Reactive.Linq.ObservableImpl
                  * 
                 lock (_parent._gate) */
                 {
-                    //
-                    // When the ref count goes to zero, no-one should be able to perform operations on
-                    // the session object anymore, because it gets nulled out.
-                    //
-                    Debug.Assert(_removeHandler == null);
-                    _removeHandler = new SingleAssignmentDisposable();
-
                     //
                     // Conversion code is supposed to be a pure function and shouldn't be run on the
                     // scheduler, but the add handler call should. Notice the scheduler can be the
@@ -370,7 +360,7 @@ namespace System.Reactive.Linq.ObservableImpl
             _addHandler(handler);
             return Disposable.Create(
                 (_removeHandler, handler),
-                tuple => tuple._removeHandler(tuple.handler));
+                static tuple => tuple._removeHandler(tuple.handler));
         }
     }
 }

+ 4 - 6
Rx.NET/Source/src/System.Reactive/Linq/Observable/FromEventPattern.cs

@@ -2,8 +2,6 @@
 // The .NET Foundation licenses this file to you under the MIT License.
 // See the LICENSE file in the project root for more information. 
 
-#nullable disable
-
 using System.Reactive.Concurrency;
 using System.Reflection;
 using System.Threading;
@@ -19,7 +17,7 @@ namespace System.Reactive.Linq.ObservableImpl
     {
         public sealed class Impl<TDelegate, TEventArgs> : ClassicEventProducer<TDelegate, EventPattern<TEventArgs>>
         {
-            private readonly Func<EventHandler<TEventArgs>, TDelegate> _conversion;
+            private readonly Func<EventHandler<TEventArgs>, TDelegate>? _conversion;
 
             public Impl(Action<TDelegate> addHandler, Action<TDelegate> removeHandler, IScheduler scheduler)
                 : base(addHandler, removeHandler, scheduler)
@@ -113,7 +111,7 @@ namespace System.Reactive.Linq.ObservableImpl
                         removeHandler = AddHandlerCore(handler);
                     }
                 }
-                catch (TargetInvocationException tie)
+                catch (TargetInvocationException tie) when (tie.InnerException != null)
                 {
                     throw tie.InnerException;
                 }
@@ -123,7 +121,7 @@ namespace System.Reactive.Linq.ObservableImpl
 
             private sealed class RemoveHandlerDisposable : IDisposable
             {
-                private Action _removeHandler;
+                private Action? _removeHandler;
 
                 public RemoveHandlerDisposable(Action removeHandler)
                 {
@@ -136,7 +134,7 @@ namespace System.Reactive.Linq.ObservableImpl
                     {
                         Interlocked.Exchange(ref _removeHandler, null)?.Invoke();
                     }
-                    catch (TargetInvocationException tie)
+                    catch (TargetInvocationException tie) when (tie.InnerException != null)
                     {
                         throw tie.InnerException;
                     }

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

@@ -47,11 +47,11 @@ namespace System.Reactive
     }
     public class EventPattern<TEventArgs> : System.Reactive.EventPattern<object, TEventArgs>
     {
-        public EventPattern(object sender, TEventArgs e) { }
+        public EventPattern(object? sender, TEventArgs e) { }
     }
     public class EventPattern<TSender, TEventArgs> : System.IEquatable<System.Reactive.EventPattern<TSender, TEventArgs>>, System.Reactive.IEventPattern<TSender, TEventArgs>
     {
-        public EventPattern(TSender sender, TEventArgs e) { }
+        public EventPattern(TSender? sender, TEventArgs e) { }
         public TEventArgs EventArgs { get; }
         public TSender Sender { get; }
         public bool Equals(System.Reactive.EventPattern<TSender, TEventArgs>? other) { }