[release/10.0] Fix issue with array interface devirtualization #120371
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.
Backport of #120313 to release/10.0
/cc @AndyAyersMS
Customer Impact
Reported in #120270
Regression
When we enabled devirtualization of array interface methods, the interface got instantiated with the array element type, not the interface parameter type. This devirtualization is new in .NET 10.
This can cause runtime failures as these two can diverge, eg
enum[]can be cast toIEnumerable<int>.Testing
Fixed the repro case and several similar test cases (added). This corrects behavior for the value class case and disables the optimization for some ref class cases.
Risk
Low. We are now creating the proper type (for value classes) or disabling the optimization (for ref classes cast to shared interface types).