Skip to content

Commit 61c376b

Browse files
CopilotT-Gro
andcommitted
Fix nullable Event<'Delegate, 'Args> for INotifyPropertyChanged
Co-authored-by: T-Gro <46543583+T-Gro@users.noreply.github.com>
1 parent f5ecf80 commit 61c376b

File tree

3 files changed

+34
-7
lines changed

3 files changed

+34
-7
lines changed

src/FSharp.Core/event.fs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ type EventWrapper<'Delegate, 'Args> = delegate of 'Delegate * objnull * 'Args ->
8383
type Event<'Delegate, 'Args
8484
when 'Delegate: delegate<'Args, unit> and 'Delegate :> System.Delegate and 'Delegate: not struct>() =
8585

86-
let mutable multicast: 'Delegate = Unchecked.defaultof<_>
86+
let mutable multicast: 'Delegate | null = Unchecked.defaultof<_>
8787

8888
static let mi, argTypes =
8989
let instanceBindingFlags =
@@ -146,10 +146,10 @@ type Event<'Delegate, 'Args
146146
"<published event>"
147147
interface IEvent<'Delegate, 'Args> with
148148
member e.AddHandler(d) =
149-
Atomic.setWith (fun value -> System.Delegate.Combine(value, d) :?> 'Delegate) &multicast
149+
Atomic.setWith (fun value -> System.Delegate.Combine(value, d) :?> ('Delegate | null)) &multicast
150150

151151
member e.RemoveHandler(d) =
152-
Atomic.setWith (fun value -> System.Delegate.Remove(value, d) :?> 'Delegate) &multicast
152+
Atomic.setWith (fun value -> System.Delegate.Remove(value, d) :?> ('Delegate | null)) &multicast
153153
interface System.IObservable<'Args> with
154154
member e.Subscribe(observer) =
155155
let obj = new EventDelegee<'Args>(observer)
@@ -166,7 +166,7 @@ type Event<'Delegate, 'Args
166166

167167
[<CompiledName("FSharpEvent`1")>]
168168
type Event<'T> =
169-
val mutable multicast: Handler<'T>
169+
val mutable multicast: Handler<'T> | null
170170
new() = { multicast = null }
171171

172172
member x.Trigger(arg: 'T) =
@@ -180,10 +180,10 @@ type Event<'T> =
180180
"<published event>"
181181
interface IEvent<'T> with
182182
member e.AddHandler(d) =
183-
Atomic.setWith (fun value -> System.Delegate.Combine(value, d) :?> Handler<'T>) &x.multicast
183+
Atomic.setWith (fun value -> System.Delegate.Combine(value, d) :?> Handler<'T> | null) &x.multicast
184184

185185
member e.RemoveHandler(d) =
186-
Atomic.setWith (fun value -> System.Delegate.Remove(value, d) :?> Handler<'T>) &x.multicast
186+
Atomic.setWith (fun value -> System.Delegate.Remove(value, d) :?> Handler<'T> | null) &x.multicast
187187
interface System.IObservable<'T> with
188188
member e.Subscribe(observer) =
189189
let h = new Handler<_>(fun sender args -> observer.OnNext(args))
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
namespace Nullness
2+
3+
open System.ComponentModel
4+
5+
type XViewModel() =
6+
let propertyChanged = Event<PropertyChangedEventHandler, PropertyChangedEventArgs>()
7+
8+
interface INotifyPropertyChanged with
9+
[<CLIEvent>]
10+
member this.PropertyChanged = propertyChanged.Publish

tests/FSharp.Compiler.ComponentTests/Language/Nullness/NullableReferenceTypesTests.fs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1540,4 +1540,21 @@ let main _ =
15401540
|> compile
15411541
//|> verifyIL ["abc"]
15421542
|> run
1543-
|> verifyOutputContains [|"Test true;,1 true,2 true,3 true,4 true,5 true,6 false,7 true,8 false,9 false,10 false,11 false,12 true"|]
1543+
|> verifyOutputContains [|"Test true;,1 true,2 true,3 true,4 true,5 true,6 false,7 true,8 false,9 false,10 false,11 false,12 true"|]
1544+
1545+
[<Fact>]
1546+
let ``INotifyPropertyChanged with Event using PropertyChangedEventHandler`` () =
1547+
FSharp """namespace Nullness
1548+
1549+
open System.ComponentModel
1550+
1551+
type XViewModel() =
1552+
let propertyChanged = Event<PropertyChangedEventHandler, PropertyChangedEventArgs>()
1553+
1554+
interface INotifyPropertyChanged with
1555+
[<CLIEvent>]
1556+
member this.PropertyChanged = propertyChanged.Publish
1557+
"""
1558+
|> asLibrary
1559+
|> typeCheckWithStrictNullness
1560+
|> shouldSucceed

0 commit comments

Comments
 (0)