@@ -693,7 +693,22 @@ private unsafe void InternalSetValue(object? value, nint flattenedIndex)
693
693
// value class or primitive type
694
694
695
695
ref byte offsetDataRef = ref Unsafe . Add ( ref arrayDataRef , flattenedIndex * pMethodTable ->ComponentSize ) ;
696
- if ( ! RuntimeHelpers . TryUnboxInto ( ref offsetDataRef , pElementMethodTable , value ) )
696
+ if ( CastHelpers . IsInstanceOfAny ( pElementMethodTable , value ) != null )
697
+ {
698
+ if ( pElementMethodTable ->IsNullable )
699
+ {
700
+ RuntimeHelpers . Unbox_Nullable ( ref offsetDataRef , pElementMethodTable , value ) ;
701
+ }
702
+ else if ( pElementMethodTable ->ContainsGCPointers )
703
+ {
704
+ Buffer . BulkMoveWithWriteBarrier ( ref offsetDataRef , ref value . GetRawData ( ) , pElementMethodTable ->GetNumInstanceFieldBytes ( ) ) ;
705
+ }
706
+ else
707
+ {
708
+ SpanHelpers . Memmove ( ref offsetDataRef , ref value . GetRawData ( ) , pElementMethodTable ->GetNumInstanceFieldBytes ( ) ) ;
709
+ }
710
+ }
711
+ else
697
712
{
698
713
// Allow enum -> primitive conversion, disallow primitive -> enum conversion
699
714
MethodTable * thSrc = RuntimeHelpers . GetMethodTable ( value ) ;
@@ -707,7 +722,7 @@ private unsafe void InternalSetValue(object? value, nint flattenedIndex)
707
722
if ( ! RuntimeHelpers . CanPrimitiveWiden ( srcType , targetType ) )
708
723
ThrowHelper . ThrowArgumentException ( ExceptionResource . Arg_PrimitiveWiden ) ;
709
724
710
- PrimitiveWiden ( ref Unsafe . Unbox < byte > ( value ) , ref offsetDataRef , srcType , targetType ) ;
725
+ PrimitiveWiden ( ref value . GetRawData ( ) , ref offsetDataRef , srcType , targetType ) ;
711
726
}
712
727
}
713
728
0 commit comments