[Mono] Fix CustomAttributeTypedArgument.Value to return ReadOnlyCollection for arrays in native code #119293
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 fixes a bug in Mono's implementation where
CustomAttributeTypedArgument.Valuewas not returning the documentedReadOnlyCollection<CustomAttributeTypedArgument>for array arguments, causing anInvalidCastExceptionin theToString()method.Problem
The issue occurred when accessing custom attributes with array parameters on Mono. For example:
On Mono, this would throw:
Root Cause
The
ToString()method inCustomAttributeTypedArgumentexpects array values to beIList<CustomAttributeTypedArgument>, but Mono was returning the raw array type instead of wrapping it in aReadOnlyCollection<CustomAttributeTypedArgument>as documented and as implemented in CoreCLR.Solution
Following feedback from @jkotas, the fix was implemented in Mono's native code rather than the shared managed code:
create_cattr_typed_arg: Updated this function in Mono'scustom-attrs.cto detect array arguments and convert each array element to aCustomAttributeTypedArgumentCustomAttributeTypedArgumentCanonicalizeValuemethod to convertCustomAttributeTypedArgument[]toReadOnlyCollection<CustomAttributeTypedArgument>usingArray.AsReadOnly()This approach ensures the fix is specific to Mono's implementation while maintaining compatibility with CoreCLR's existing behavior.
Testing
Test_CustomAttributeTypedArgument_ArrayValue_ShouldBeReadOnlyCollectionpassesTest_CustomAttributeTypedArgument_ToStringtest continues to passInvalidCastExceptionFixes #119292.
✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.