-
Notifications
You must be signed in to change notification settings - Fork 5.5k
Fix RemoveImpl nullability #129661
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
MichalPetryka
wants to merge
6
commits into
dotnet:main
Choose a base branch
from
MichalPetryka:removeimpl-null
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Fix RemoveImpl nullability #129661
Changes from all commits
Commits
Show all changes
6 commits
Select commit
Hold shift + click to select a range
291e410
Fix RemoveImpl nullability
MichalPetryka 7c3769b
Fix RemoveImpl method to handle null delegate
MichalPetryka 75bc5a3
Update RemoveImpl method signature to be nullable
MichalPetryka b6178dc
Use null-forgiving operator in delegate comparison
MichalPetryka d2e634f
Rename variable 'value' to 'v' for clarity
MichalPetryka c0fe733
Merge branch 'main' into removeimpl-null
MichalPetryka File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This doesn't change behaviour in practice since all runtimes override the method.
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
These 3 methods cannot be overridden by user code either. Would it be possible to make them non-virtual instead of this? Follow the same pattern as
HasSingleTargetfor now, ideally we would move the code from Multicast to Delegate to avoid the forwarder, but that should be its own PR.Making these 3 methods non-virtual would save 3 virtual slots in every delegate type.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
They're a part of the API contract in ref assembly so we can't remove them.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It is fine to change the ref assemblies as long as the change is non-breaking. Can you think about a scenario that would be broken by removing virtual on these methods?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
One I can think of is that creating a closed delegate to it would now be different between Delegate and MulticastDelegate.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You can do that only via private reflection or invalid IL. We are not concerned about that.
https://github.com/dotnet/runtime/blob/main/docs/coding-guidelines/breaking-change-rules.md has the list of allows vs. disallowed changes. Removing virtual on these methods is equivalent to combination of the following allowed changes:
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Since the method is protected and in ref assembly, afair the reflection is not private here?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The existing "Decreasing the visibility of a protected member when there are no accessible (public or protected) constructors or the type is sealed" would be reflection-breaking too if this was considered supported reflection. The only thing that could legitimately reflect on the protected members would be delegate descendants, but they cannot effectively have any code in it.