From 9ee7dc39690f3eac2a255027ed9e8135781b6bd4 Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Thu, 29 Sep 2022 18:28:36 -0700 Subject: [PATCH 1/8] Fix AOT warnings from using the linker xml support in crossgen2. --- .../src/System/Net/Http/DiagnosticsHandler.cs | 2 ++ .../src/System/Xml/Schema/ContentValidator.cs | 6 +++--- .../src/System/Xml/Schema/DataTypeImplementation.cs | 3 +++ .../src/System/Xml/Schema/XmlValueConverter.cs | 4 ++++ 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs b/src/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs index 16ce1141e2b081..175775f14870fa 100644 --- a/src/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs +++ b/src/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs @@ -325,6 +325,8 @@ key is not null && [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:UnrecognizedReflectionPattern", Justification = "The values being passed into Write have the commonly used properties being preserved with DynamicDependency.")] + [UnconditionalSuppressMessage("AotAnalysis", "IL3050:AotUnfriendlyApi", + Justification = "The values being passed into Write have the commonly used properties being preserved with DynamicDependency.")] private static void Write<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] T>( DiagnosticSource diagnosticSource, string name, diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Schema/ContentValidator.cs b/src/libraries/System.Private.Xml/src/System/Xml/Schema/ContentValidator.cs index 306d605dda4425..60dc7a394078b8 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Schema/ContentValidator.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Schema/ContentValidator.cs @@ -1439,7 +1439,7 @@ private void CheckUniqueParticleAttribution(BitSet curpos) int symbolsCount = _symbols!.Count; // transition table (Dtran in the book) - ArrayList transitionTable = new ArrayList(); + List transitionTable = new(); // state lookup table (Dstate in the book) Dictionary stateTable = new(); @@ -1461,7 +1461,7 @@ private void CheckUniqueParticleAttribution(BitSet curpos) { BitSet statePosSet = unmarked.Dequeue(); // all positions that constitute DFA state Debug.Assert(state == stateTable[statePosSet]); // just make sure that statePosSet is for correct state - int[] transition = (int[])transitionTable[state]!; + int[] transition = transitionTable[state]!; if (statePosSet[endMarkerPos]) { transition[symbolsCount] = 1; // accepting @@ -1506,7 +1506,7 @@ private void CheckUniqueParticleAttribution(BitSet curpos) state++; } // now convert transition table to array - return (int[][])transitionTable.ToArray(typeof(int[])); + return transitionTable.ToArray(); } #if DEBUG diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Schema/DataTypeImplementation.cs b/src/libraries/System.Private.Xml/src/System/Xml/Schema/DataTypeImplementation.cs index c026afb4c4ce4e..9b8aa5d6dd372f 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Schema/DataTypeImplementation.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Schema/DataTypeImplementation.cs @@ -5,6 +5,7 @@ using System.IO; using System.Collections; using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Text; using System.Text.RegularExpressions; @@ -1088,6 +1089,8 @@ internal override RestrictionFlags ValidRestrictionFlags return exception; } + [UnconditionalSuppressMessage("AotAnalysis", "IL3050:AotUnfriendlyApi", + Justification = "All types that are instantiated with this method are used elsewhere in this file in the implementations of the DatatypeImplementation abstract class.")] internal override Exception? TryParseValue(string s, XmlNameTable? nameTable, IXmlNamespaceResolver? nsmgr, out object? typedValue) { Exception? exception; diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Schema/XmlValueConverter.cs b/src/libraries/System.Private.Xml/src/System/Xml/Schema/XmlValueConverter.cs index 7fc4393af3d696..3b1bcefc3c2497 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Schema/XmlValueConverter.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Schema/XmlValueConverter.cs @@ -6,6 +6,7 @@ using System.Xml.XPath; using System.Globalization; using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; using System.Collections; using System.Collections.Generic; using System.Xml.Schema; @@ -268,6 +269,9 @@ protected XmlBaseConverter(XmlTypeCode typeCode) _typeCode = typeCode; } + + [UnconditionalSuppressMessage("AotAnalysis", "IL3050:AotUnfriendlyApi", + Justification = "All types that are instantiated with this method are used elsewhere throughout System.Private.Xml.")] protected XmlBaseConverter(XmlBaseConverter converterAtomic) { _schemaType = converterAtomic._schemaType; From c823cf03f1b494eba94d0e462d845f9867d1576b Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Fri, 30 Sep 2022 16:42:16 -0700 Subject: [PATCH 2/8] Revise message to better explain why these types will be available. --- .../src/System/Xml/Schema/XmlValueConverter.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Schema/XmlValueConverter.cs b/src/libraries/System.Private.Xml/src/System/Xml/Schema/XmlValueConverter.cs index 3b1bcefc3c2497..6e3a39999881a6 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Schema/XmlValueConverter.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Schema/XmlValueConverter.cs @@ -269,9 +269,8 @@ protected XmlBaseConverter(XmlTypeCode typeCode) _typeCode = typeCode; } - [UnconditionalSuppressMessage("AotAnalysis", "IL3050:AotUnfriendlyApi", - Justification = "All types that are instantiated with this method are used elsewhere throughout System.Private.Xml.")] + Justification = "All types that are instantiated by XmlValueConverters are used elsewhere in the implementations of the DatatypeImplementation abstract class.")] protected XmlBaseConverter(XmlBaseConverter converterAtomic) { _schemaType = converterAtomic._schemaType; From 3cd2f14248685b8cb41ef3facb23f56d9a4ed0f3 Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Mon, 3 Oct 2022 10:00:59 -0700 Subject: [PATCH 3/8] Update src/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs --- .../System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs b/src/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs index 175775f14870fa..16ce1141e2b081 100644 --- a/src/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs +++ b/src/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs @@ -325,8 +325,6 @@ key is not null && [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:UnrecognizedReflectionPattern", Justification = "The values being passed into Write have the commonly used properties being preserved with DynamicDependency.")] - [UnconditionalSuppressMessage("AotAnalysis", "IL3050:AotUnfriendlyApi", - Justification = "The values being passed into Write have the commonly used properties being preserved with DynamicDependency.")] private static void Write<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] T>( DiagnosticSource diagnosticSource, string name, From afc3df2bc24f3c54d7ea8a2292bb4bcf06fc95ff Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Mon, 3 Oct 2022 10:24:37 -0700 Subject: [PATCH 4/8] Remove suppressions and change implementation to not require suppressions. --- .../Xml/Schema/DataTypeImplementation.cs | 15 ++++++----- .../System/Xml/Schema/XmlSchemaDataType.cs | 2 ++ .../System/Xml/Schema/XmlValueConverter.cs | 27 ++++++++++++++----- 3 files changed, 32 insertions(+), 12 deletions(-) diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Schema/DataTypeImplementation.cs b/src/libraries/System.Private.Xml/src/System/Xml/Schema/DataTypeImplementation.cs index 9b8aa5d6dd372f..0f648dadbe7464 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Schema/DataTypeImplementation.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Schema/DataTypeImplementation.cs @@ -522,8 +522,6 @@ internal override bool HasValueFacets protected DatatypeImplementation? Base { get { return _baseType; } } - internal abstract Type ListValueType { get; } - internal abstract RestrictionFlags ValidRestrictionFlags { get; } internal override XmlSchemaWhiteSpace BuiltInWhitespaceFacet { get { return XmlSchemaWhiteSpace.Preserve; } } @@ -1089,8 +1087,6 @@ internal override RestrictionFlags ValidRestrictionFlags return exception; } - [UnconditionalSuppressMessage("AotAnalysis", "IL3050:AotUnfriendlyApi", - Justification = "All types that are instantiated with this method are used elsewhere in this file in the implementations of the DatatypeImplementation abstract class.")] internal override Exception? TryParseValue(string s, XmlNameTable? nameTable, IXmlNamespaceResolver? nsmgr, out object? typedValue) { Exception? exception; @@ -1129,8 +1125,8 @@ internal override RestrictionFlags ValidRestrictionFlags values.Add(typedValue); } - array = values.ToArray(_itemType.ValueType); - Debug.Assert(array.GetType() == ListValueType); + array = ToArray(values, _itemType.ListValueType); + Debug.Assert(array.GetType() == _itemType.ValueType.MakeArrayType()); } if (values.Count < _minListSize) { @@ -1146,6 +1142,13 @@ internal override RestrictionFlags ValidRestrictionFlags Error: return exception; + + [UnconditionalSuppressMessage("AotAnalysis", "IL3050:AotUnfriendlyApi", + Justification = "Array type is alwasys present as it is passed in as a parameter.")] + static Array ToArray(ArrayList values, Type arrayType) + { + return values.ToArray(arrayType.GetElementType()!); + } } } diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Schema/XmlSchemaDataType.cs b/src/libraries/System.Private.Xml/src/System/Xml/Schema/XmlSchemaDataType.cs index e6a9aff012f7a4..5cd0d5b9d35a7a 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Schema/XmlSchemaDataType.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Schema/XmlSchemaDataType.cs @@ -21,6 +21,8 @@ public abstract class XmlSchemaDatatype public virtual XmlSchemaDatatypeVariety Variety { get { return XmlSchemaDatatypeVariety.Atomic; } } + internal abstract Type ListValueType { get; } + internal XmlSchemaDatatype() { } public virtual object ChangeType(object value, Type targetType) diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Schema/XmlValueConverter.cs b/src/libraries/System.Private.Xml/src/System/Xml/Schema/XmlValueConverter.cs index 6e3a39999881a6..cd00125c7beab6 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Schema/XmlValueConverter.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Schema/XmlValueConverter.cs @@ -226,6 +226,7 @@ internal abstract class XmlBaseConverter : XmlValueConverter private readonly XmlSchemaType? _schemaType; private readonly XmlTypeCode _typeCode; private readonly Type? _clrTypeDefault; + private readonly Type? _clrListTypeDefault; protected XmlBaseConverter(XmlSchemaType schemaType) { @@ -243,6 +244,7 @@ protected XmlBaseConverter(XmlSchemaType schemaType) _schemaType = schemaType; _typeCode = schemaType.TypeCode; _clrTypeDefault = schemaType.Datatype.ValueType; + _clrListTypeDefault = schemaType.Datatype.ListValueType; } protected XmlBaseConverter(XmlTypeCode typeCode) @@ -251,14 +253,17 @@ protected XmlBaseConverter(XmlTypeCode typeCode) { case XmlTypeCode.Item: _clrTypeDefault = XPathItemType; + _clrListTypeDefault = XPathItemArrayType; break; case XmlTypeCode.Node: _clrTypeDefault = XPathNavigatorType; + _clrListTypeDefault = XPathNavigatorArrayType; break; case XmlTypeCode.AnyAtomicType: _clrTypeDefault = XmlAtomicValueType; + _clrListTypeDefault = XmlAtomicValueArrayType; break; default: @@ -269,20 +274,22 @@ protected XmlBaseConverter(XmlTypeCode typeCode) _typeCode = typeCode; } - [UnconditionalSuppressMessage("AotAnalysis", "IL3050:AotUnfriendlyApi", - Justification = "All types that are instantiated by XmlValueConverters are used elsewhere in the implementations of the DatatypeImplementation abstract class.")] protected XmlBaseConverter(XmlBaseConverter converterAtomic) { _schemaType = converterAtomic._schemaType; _typeCode = converterAtomic._typeCode; - _clrTypeDefault = Array.CreateInstance(converterAtomic.DefaultClrType!, 0).GetType(); + _clrTypeDefault = converterAtomic.DefaultClrListType; + Debug.Assert(_clrTypeDefault!.IsArray); + // We don't support lists-of-lists, so we don't set _clrListTypeDefault to null. + _clrListTypeDefault = null; } - protected XmlBaseConverter(XmlBaseConverter converterAtomic, Type clrTypeDefault) + protected XmlBaseConverter(XmlBaseConverter converterAtomic, Type clrTypeDefault, Type clrListTypeDefault) { _schemaType = converterAtomic._schemaType; _typeCode = converterAtomic._typeCode; _clrTypeDefault = clrTypeDefault; + _clrListTypeDefault = clrListTypeDefault; } protected static readonly Type ICollectionType = typeof(ICollection); @@ -290,7 +297,10 @@ protected XmlBaseConverter(XmlBaseConverter converterAtomic, Type clrTypeDefault protected static readonly Type IListType = typeof(IList); protected static readonly Type ObjectArrayType = typeof(object[]); protected static readonly Type StringArrayType = typeof(string[]); + protected static readonly Type StringArrayArrayType = typeof(string[][]); protected static readonly Type XmlAtomicValueArrayType = typeof(XmlAtomicValue[]); + protected static readonly Type XPathItemArrayType = typeof(XPathItem[]); + protected static readonly Type XPathNavigatorArrayType = typeof(XPathNavigator[]); #region AUTOGENERATED_XMLBASECONVERTER protected static readonly Type DecimalType = typeof(decimal); @@ -435,6 +445,11 @@ protected Type? DefaultClrType get { return _clrTypeDefault; } } + protected Type? DefaultClrListType + { + get { return _clrListTypeDefault; } + } + /// /// Type.IsSubtypeOf does not return true if types are equal, this method does. /// @@ -1991,7 +2006,7 @@ private XmlUntypedConverter() : base(DatatypeImplementation.UntypedAtomicType) } private XmlUntypedConverter(XmlUntypedConverter atomicConverter, bool allowListToList) - : base(atomicConverter, allowListToList ? StringArrayType : StringType) + : base(atomicConverter, allowListToList ? StringArrayType : StringType, allowListToList ? StringArrayArrayType : StringArrayType) { _allowListToList = allowListToList; } @@ -2878,7 +2893,7 @@ protected XmlListConverter(XmlBaseConverter atomicConverter) : base(atomicConver this.atomicConverter = atomicConverter; } - protected XmlListConverter(XmlBaseConverter atomicConverter, Type clrTypeDefault) : base(atomicConverter, clrTypeDefault) + protected XmlListConverter(XmlBaseConverter atomicConverter, Type clrTypeDefault, Type clrListTypeDefault) : base(atomicConverter, clrTypeDefault, clrListTypeDefault) { this.atomicConverter = atomicConverter; } From 05188da58ca205b61535d7976a5a1942fe34f4e4 Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Mon, 3 Oct 2022 10:35:10 -0700 Subject: [PATCH 5/8] Move debug assert into the local function. --- .../src/System/Xml/Schema/DataTypeImplementation.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Schema/DataTypeImplementation.cs b/src/libraries/System.Private.Xml/src/System/Xml/Schema/DataTypeImplementation.cs index 0f648dadbe7464..46702d6bc06822 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Schema/DataTypeImplementation.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Schema/DataTypeImplementation.cs @@ -1126,7 +1126,6 @@ internal override RestrictionFlags ValidRestrictionFlags values.Add(typedValue); } array = ToArray(values, _itemType.ListValueType); - Debug.Assert(array.GetType() == _itemType.ValueType.MakeArrayType()); } if (values.Count < _minListSize) { @@ -1145,9 +1144,11 @@ internal override RestrictionFlags ValidRestrictionFlags [UnconditionalSuppressMessage("AotAnalysis", "IL3050:AotUnfriendlyApi", Justification = "Array type is alwasys present as it is passed in as a parameter.")] - static Array ToArray(ArrayList values, Type arrayType) + Array ToArray(ArrayList values, Type arrayType) { - return values.ToArray(arrayType.GetElementType()!); + Array array = values.ToArray(arrayType.GetElementType()!); + Debug.Assert(array.GetType() == _itemType.ValueType.MakeArrayType()); + return array; } } } From 7cce2c02c99cf99823b70e508e5c71f122bc926d Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Mon, 3 Oct 2022 15:43:08 -0700 Subject: [PATCH 6/8] Apply suggestions from code review Co-authored-by: Eric Erhardt --- .../src/System/Xml/Schema/DataTypeImplementation.cs | 2 +- .../src/System/Xml/Schema/XmlValueConverter.cs | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Schema/DataTypeImplementation.cs b/src/libraries/System.Private.Xml/src/System/Xml/Schema/DataTypeImplementation.cs index 46702d6bc06822..a5ae10411c2ab8 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Schema/DataTypeImplementation.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Schema/DataTypeImplementation.cs @@ -1143,7 +1143,7 @@ internal override RestrictionFlags ValidRestrictionFlags return exception; [UnconditionalSuppressMessage("AotAnalysis", "IL3050:AotUnfriendlyApi", - Justification = "Array type is alwasys present as it is passed in as a parameter.")] + Justification = "Array type is always present as it is passed in as a parameter.")] Array ToArray(ArrayList values, Type arrayType) { Array array = values.ToArray(arrayType.GetElementType()!); diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Schema/XmlValueConverter.cs b/src/libraries/System.Private.Xml/src/System/Xml/Schema/XmlValueConverter.cs index cd00125c7beab6..e61e727026107b 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Schema/XmlValueConverter.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Schema/XmlValueConverter.cs @@ -280,7 +280,7 @@ protected XmlBaseConverter(XmlBaseConverter converterAtomic) _typeCode = converterAtomic._typeCode; _clrTypeDefault = converterAtomic.DefaultClrListType; Debug.Assert(_clrTypeDefault!.IsArray); - // We don't support lists-of-lists, so we don't set _clrListTypeDefault to null. + // We don't support lists-of-lists, so we set _clrListTypeDefault to null. _clrListTypeDefault = null; } @@ -445,6 +445,9 @@ protected Type? DefaultClrType get { return _clrTypeDefault; } } + /// + /// Return an array type with the element type of the default V1 Clr mapping of this converter's type. + /// protected Type? DefaultClrListType { get { return _clrListTypeDefault; } From 1b7731d85543932037f29faf599a8e5e1dda3669 Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Mon, 3 Oct 2022 15:49:51 -0700 Subject: [PATCH 7/8] Apply suggestions from code review Co-authored-by: Jan Kotas --- .../src/System/Xml/Schema/DataTypeImplementation.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Schema/DataTypeImplementation.cs b/src/libraries/System.Private.Xml/src/System/Xml/Schema/DataTypeImplementation.cs index a5ae10411c2ab8..32439f4e1b4c0f 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Schema/DataTypeImplementation.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Schema/DataTypeImplementation.cs @@ -1125,6 +1125,7 @@ internal override RestrictionFlags ValidRestrictionFlags values.Add(typedValue); } + Debug.Assert(_itemType.ListValueType.GetElementType() == _itemType.ValueType); array = ToArray(values, _itemType.ListValueType); } if (values.Count < _minListSize) @@ -1142,12 +1143,12 @@ internal override RestrictionFlags ValidRestrictionFlags Error: return exception; + // TODO: Replace with https://github.com/dotnet/runtime/issues/76478 once available [UnconditionalSuppressMessage("AotAnalysis", "IL3050:AotUnfriendlyApi", Justification = "Array type is always present as it is passed in as a parameter.")] - Array ToArray(ArrayList values, Type arrayType) + static Array ToArray(ArrayList values, Type arrayType) { Array array = values.ToArray(arrayType.GetElementType()!); - Debug.Assert(array.GetType() == _itemType.ValueType.MakeArrayType()); return array; } } From a4957b5cd3965bef9aa0f59ef36e7ccb044cc1f4 Mon Sep 17 00:00:00 2001 From: Jan Kotas Date: Mon, 3 Oct 2022 15:51:46 -0700 Subject: [PATCH 8/8] Update src/libraries/System.Private.Xml/src/System/Xml/Schema/DataTypeImplementation.cs --- .../src/System/Xml/Schema/DataTypeImplementation.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Schema/DataTypeImplementation.cs b/src/libraries/System.Private.Xml/src/System/Xml/Schema/DataTypeImplementation.cs index 32439f4e1b4c0f..f4f3c6489b9398 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Schema/DataTypeImplementation.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Schema/DataTypeImplementation.cs @@ -1147,10 +1147,7 @@ internal override RestrictionFlags ValidRestrictionFlags [UnconditionalSuppressMessage("AotAnalysis", "IL3050:AotUnfriendlyApi", Justification = "Array type is always present as it is passed in as a parameter.")] static Array ToArray(ArrayList values, Type arrayType) - { - Array array = values.ToArray(arrayType.GetElementType()!); - return array; - } + => values.ToArray(arrayType.GetElementType()!); } }