Improve C# value equality documentation for polymorphic scenarios and records with collections #48073
+460
−2
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.
This PR significantly enhances the C# value equality documentation to address critical gaps in guidance around polymorphic equality and records containing reference-equality members.
Issues Addressed
1. Polymorphic Equality Problem
The existing documentation showed an implementation that fails in polymorphic scenarios:
This happens because the compiler selects the
IEquatable<TwoDPoint>
implementation based on compile-time type, ignoring the Z coordinate difference.2. Records with Reference-Equality Members
While records are recommended for value equality, they don't work correctly when containing collections or other reference types:
Solutions Implemented
Explicit Interface Implementation for Safe Polymorphic Equality
Added a comprehensive section demonstrating how to use explicit interface implementation for
IEquatable<T>
to force all equality comparisons through the virtualEquals(object?)
method:Records with Collections Guidance
Added detailed documentation explaining why records fail with collections and providing solutions including custom
IEquatable<T>
implementations for content-based comparison.Changes Made
All code examples have been tested and compile successfully, demonstrating the correct behavior for both problematic scenarios and their solutions.
Fixes #45164.
✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.