diff --git a/src/Microsoft.AspNetCore.Mvc.Abstractions/ActionConstraints/ActionSelectorCandidate.cs b/src/Microsoft.AspNetCore.Mvc.Abstractions/ActionConstraints/ActionSelectorCandidate.cs
index c2251cd371..7cf58a4845 100644
--- a/src/Microsoft.AspNetCore.Mvc.Abstractions/ActionConstraints/ActionSelectorCandidate.cs
+++ b/src/Microsoft.AspNetCore.Mvc.Abstractions/ActionConstraints/ActionSelectorCandidate.cs
@@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Mvc.ActionConstraints
///
/// A candidate action for action selection.
///
- public struct ActionSelectorCandidate
+ public readonly struct ActionSelectorCandidate
{
///
/// Creates a new .
diff --git a/src/Microsoft.AspNetCore.Mvc.Abstractions/ModelBinding/EnumGroupAndName.cs b/src/Microsoft.AspNetCore.Mvc.Abstractions/ModelBinding/EnumGroupAndName.cs
index 0ad0117e5d..d4a141ed00 100644
--- a/src/Microsoft.AspNetCore.Mvc.Abstractions/ModelBinding/EnumGroupAndName.cs
+++ b/src/Microsoft.AspNetCore.Mvc.Abstractions/ModelBinding/EnumGroupAndName.cs
@@ -8,7 +8,7 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding
///
/// An abstraction used when grouping enum values for .
///
- public struct EnumGroupAndName
+ public readonly struct EnumGroupAndName
{
private readonly Func _name;
diff --git a/src/Microsoft.AspNetCore.Mvc.Abstractions/ModelBinding/Metadata/ModelMetadataIdentity.cs b/src/Microsoft.AspNetCore.Mvc.Abstractions/ModelBinding/Metadata/ModelMetadataIdentity.cs
index af97d9a043..655bd9cb74 100644
--- a/src/Microsoft.AspNetCore.Mvc.Abstractions/ModelBinding/Metadata/ModelMetadataIdentity.cs
+++ b/src/Microsoft.AspNetCore.Mvc.Abstractions/ModelBinding/Metadata/ModelMetadataIdentity.cs
@@ -11,8 +11,20 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding.Metadata
///
/// A key type which identifies a .
///
- public struct ModelMetadataIdentity : IEquatable
+ public readonly struct ModelMetadataIdentity : IEquatable
{
+ private ModelMetadataIdentity(
+ Type modelType,
+ string name = null,
+ Type containerType = null,
+ ParameterInfo parameterInfo = null)
+ {
+ ModelType = modelType;
+ Name = name;
+ ContainerType = containerType;
+ ParameterInfo = parameterInfo;
+ }
+
///
/// Creates a for the provided model .
///
@@ -25,10 +37,7 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding.Metadata
throw new ArgumentNullException(nameof(modelType));
}
- return new ModelMetadataIdentity()
- {
- ModelType = modelType,
- };
+ return new ModelMetadataIdentity(modelType);
}
///
@@ -58,12 +67,7 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding.Metadata
throw new ArgumentException(Resources.ArgumentCannotBeNullOrEmpty, nameof(name));
}
- return new ModelMetadataIdentity()
- {
- ModelType = modelType,
- Name = name,
- ContainerType = containerType,
- };
+ return new ModelMetadataIdentity(modelType, name, containerType);
}
///
@@ -93,24 +97,19 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding.Metadata
throw new ArgumentNullException(nameof(modelType));
}
- return new ModelMetadataIdentity()
- {
- Name = parameter.Name,
- ModelType = modelType,
- ParameterInfo = parameter,
- };
+ return new ModelMetadataIdentity(modelType, parameter.Name, parameterInfo: parameter);
}
///
/// Gets the defining the model property represented by the current
/// instance, or null if the current instance does not represent a property.
///
- public Type ContainerType { get; private set; }
+ public Type ContainerType { get; }
///
/// Gets the represented by the current instance.
///
- public Type ModelType { get; private set; }
+ public Type ModelType { get; }
///
/// Gets a value indicating the kind of metadata represented by the current instance.
@@ -138,13 +137,13 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding.Metadata
/// Gets the name of the current instance if it represents a parameter or property, or null if
/// the current instance represents a type.
///
- public string Name { get; private set; }
+ public string Name { get; }
///
/// Gets a descriptor for the parameter, or null if this instance
/// does not represent a parameter.
///
- public ParameterInfo ParameterInfo { get; private set; }
+ public ParameterInfo ParameterInfo { get; }
///
public bool Equals(ModelMetadataIdentity other)
diff --git a/src/Microsoft.AspNetCore.Mvc.Abstractions/ModelBinding/ModelBindingContext.cs b/src/Microsoft.AspNetCore.Mvc.Abstractions/ModelBinding/ModelBindingContext.cs
index 50c0149cc2..e133b6816e 100644
--- a/src/Microsoft.AspNetCore.Mvc.Abstractions/ModelBinding/ModelBindingContext.cs
+++ b/src/Microsoft.AspNetCore.Mvc.Abstractions/ModelBinding/ModelBindingContext.cs
@@ -156,7 +156,7 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding
/// by caller when child binding context state should be popped off of
/// the .
///
- public struct NestedScope : IDisposable
+ public readonly struct NestedScope : IDisposable
{
private readonly ModelBindingContext _context;
diff --git a/src/Microsoft.AspNetCore.Mvc.Abstractions/ModelBinding/ModelBindingResult.cs b/src/Microsoft.AspNetCore.Mvc.Abstractions/ModelBinding/ModelBindingResult.cs
index de57b8bf88..2bfc3dd5fd 100644
--- a/src/Microsoft.AspNetCore.Mvc.Abstractions/ModelBinding/ModelBindingResult.cs
+++ b/src/Microsoft.AspNetCore.Mvc.Abstractions/ModelBinding/ModelBindingResult.cs
@@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding
///
/// Contains the result of model binding.
///
- public struct ModelBindingResult : IEquatable
+ public readonly struct ModelBindingResult : IEquatable
{
///
/// Creates a representing a failed model binding operation.
diff --git a/src/Microsoft.AspNetCore.Mvc.Abstractions/ModelBinding/ModelStateDictionary.cs b/src/Microsoft.AspNetCore.Mvc.Abstractions/ModelBinding/ModelStateDictionary.cs
index 970e5b6975..68781961e6 100644
--- a/src/Microsoft.AspNetCore.Mvc.Abstractions/ModelBinding/ModelStateDictionary.cs
+++ b/src/Microsoft.AspNetCore.Mvc.Abstractions/ModelBinding/ModelStateDictionary.cs
@@ -1003,7 +1003,7 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding
}
}
- public struct PrefixEnumerable : IEnumerable>
+ public readonly struct PrefixEnumerable : IEnumerable>
{
private readonly ModelStateDictionary _dictionary;
private readonly string _prefix;
@@ -1136,7 +1136,7 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding
}
}
- public struct KeyEnumerable : IEnumerable
+ public readonly struct KeyEnumerable : IEnumerable
{
private readonly ModelStateDictionary _dictionary;
@@ -1191,7 +1191,7 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding
}
}
- public struct ValueEnumerable : IEnumerable
+ public readonly struct ValueEnumerable : IEnumerable
{
private readonly ModelStateDictionary _dictionary;
diff --git a/src/Microsoft.AspNetCore.Mvc.Abstractions/ModelBinding/ValueProviderResult.cs b/src/Microsoft.AspNetCore.Mvc.Abstractions/ModelBinding/ValueProviderResult.cs
index c9bf19ad4c..3a0b8e1fa8 100644
--- a/src/Microsoft.AspNetCore.Mvc.Abstractions/ModelBinding/ValueProviderResult.cs
+++ b/src/Microsoft.AspNetCore.Mvc.Abstractions/ModelBinding/ValueProviderResult.cs
@@ -25,7 +25,7 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding
/// regardless of whether a single value or multiple values were submitted.
///
///
- public struct ValueProviderResult : IEquatable, IEnumerable
+ public readonly struct ValueProviderResult : IEquatable, IEnumerable
{
private static readonly CultureInfo _invariantCulture = CultureInfo.InvariantCulture;
diff --git a/src/Microsoft.AspNetCore.Mvc.Analyzers.Experimental/ApiActionsAreAttributeRoutedFixProvider.cs b/src/Microsoft.AspNetCore.Mvc.Analyzers.Experimental/ApiActionsAreAttributeRoutedFixProvider.cs
index a0ea810b51..f89827b8f0 100644
--- a/src/Microsoft.AspNetCore.Mvc.Analyzers.Experimental/ApiActionsAreAttributeRoutedFixProvider.cs
+++ b/src/Microsoft.AspNetCore.Mvc.Analyzers.Experimental/ApiActionsAreAttributeRoutedFixProvider.cs
@@ -168,7 +168,7 @@ namespace Microsoft.AspNetCore.Mvc.Analyzers
return false;
}
- private struct RouteAttributeInfo
+ private readonly struct RouteAttributeInfo
{
public RouteAttributeInfo(string name, string type, string[] keywords)
{
diff --git a/src/Microsoft.AspNetCore.Mvc.ApiExplorer/DefaultApiDescriptionProvider.cs b/src/Microsoft.AspNetCore.Mvc.ApiExplorer/DefaultApiDescriptionProvider.cs
index 46fa05fb5a..6fd8c7e65f 100644
--- a/src/Microsoft.AspNetCore.Mvc.ApiExplorer/DefaultApiDescriptionProvider.cs
+++ b/src/Microsoft.AspNetCore.Mvc.ApiExplorer/DefaultApiDescriptionProvider.cs
@@ -659,7 +659,7 @@ namespace Microsoft.AspNetCore.Mvc.ApiExplorer
}
}
- private struct PropertyKey
+ private readonly struct PropertyKey
{
public readonly Type ContainerType;
diff --git a/src/Microsoft.AspNetCore.Mvc.Core/Formatters/MediaType.cs b/src/Microsoft.AspNetCore.Mvc.Core/Formatters/MediaType.cs
index 00e2459f09..7c557ed4cc 100644
--- a/src/Microsoft.AspNetCore.Mvc.Core/Formatters/MediaType.cs
+++ b/src/Microsoft.AspNetCore.Mvc.Core/Formatters/MediaType.cs
@@ -13,7 +13,7 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
///
/// A media type value.
///
- public struct MediaType
+ public readonly struct MediaType
{
private static readonly StringSegment QualityParameter = new StringSegment("q");
@@ -683,7 +683,7 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
}
}
- private struct MediaTypeParameter : IEquatable
+ private readonly struct MediaTypeParameter : IEquatable
{
public MediaTypeParameter(StringSegment name, StringSegment value)
{
diff --git a/src/Microsoft.AspNetCore.Mvc.Core/Internal/ClientValidatorCache.cs b/src/Microsoft.AspNetCore.Mvc.Core/Internal/ClientValidatorCache.cs
index 37adde40c2..0bcc97f67b 100644
--- a/src/Microsoft.AspNetCore.Mvc.Core/Internal/ClientValidatorCache.cs
+++ b/src/Microsoft.AspNetCore.Mvc.Core/Internal/ClientValidatorCache.cs
@@ -121,7 +121,7 @@ namespace Microsoft.AspNetCore.Mvc.Internal
return validators;
}
- private struct CacheEntry
+ private readonly struct CacheEntry
{
public CacheEntry(IReadOnlyList validators)
{
diff --git a/src/Microsoft.AspNetCore.Mvc.Core/Internal/ControllerBinderDelegateProvider.cs b/src/Microsoft.AspNetCore.Mvc.Core/Internal/ControllerBinderDelegateProvider.cs
index e29525ea11..20d600281e 100644
--- a/src/Microsoft.AspNetCore.Mvc.Core/Internal/ControllerBinderDelegateProvider.cs
+++ b/src/Microsoft.AspNetCore.Mvc.Core/Internal/ControllerBinderDelegateProvider.cs
@@ -194,7 +194,7 @@ namespace Microsoft.AspNetCore.Mvc.Internal
return propertyBindingInfo;
}
- private struct BinderItem
+ private readonly struct BinderItem
{
public BinderItem(IModelBinder modelBinder, ModelMetadata modelMetadata)
{
diff --git a/src/Microsoft.AspNetCore.Mvc.Core/Internal/FilterCursorItem.cs b/src/Microsoft.AspNetCore.Mvc.Core/Internal/FilterCursorItem.cs
index ccb42dc3f7..a62aa1b8cc 100644
--- a/src/Microsoft.AspNetCore.Mvc.Core/Internal/FilterCursorItem.cs
+++ b/src/Microsoft.AspNetCore.Mvc.Core/Internal/FilterCursorItem.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Mvc.Internal
{
- public struct FilterCursorItem
+ public readonly struct FilterCursorItem
{
public FilterCursorItem(TFilter filter, TFilterAsync filterAsync)
{
diff --git a/src/Microsoft.AspNetCore.Mvc.Core/Internal/FilterFactoryResult.cs b/src/Microsoft.AspNetCore.Mvc.Core/Internal/FilterFactoryResult.cs
index e532a08427..69e39cfea9 100644
--- a/src/Microsoft.AspNetCore.Mvc.Core/Internal/FilterFactoryResult.cs
+++ b/src/Microsoft.AspNetCore.Mvc.Core/Internal/FilterFactoryResult.cs
@@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Mvc.Filters;
namespace Microsoft.AspNetCore.Mvc.Internal
{
- public struct FilterFactoryResult
+ public readonly struct FilterFactoryResult
{
public FilterFactoryResult(
FilterItem[] cacheableFilters,
diff --git a/src/Microsoft.AspNetCore.Mvc.Core/Internal/MediaTypeSegmentWithQuality.cs b/src/Microsoft.AspNetCore.Mvc.Core/Internal/MediaTypeSegmentWithQuality.cs
index c9a8f4502e..52d6281ed1 100644
--- a/src/Microsoft.AspNetCore.Mvc.Core/Internal/MediaTypeSegmentWithQuality.cs
+++ b/src/Microsoft.AspNetCore.Mvc.Core/Internal/MediaTypeSegmentWithQuality.cs
@@ -8,7 +8,7 @@ namespace Microsoft.AspNetCore.Mvc.Formatters.Internal
///
/// A media type with its associated quality.
///
- public struct MediaTypeSegmentWithQuality
+ public readonly struct MediaTypeSegmentWithQuality
{
///
/// Initializes an instance of .
diff --git a/src/Microsoft.AspNetCore.Mvc.Core/Internal/ValidatorCache.cs b/src/Microsoft.AspNetCore.Mvc.Core/Internal/ValidatorCache.cs
index 61fcfe0c15..61e8303d40 100644
--- a/src/Microsoft.AspNetCore.Mvc.Core/Internal/ValidatorCache.cs
+++ b/src/Microsoft.AspNetCore.Mvc.Core/Internal/ValidatorCache.cs
@@ -122,7 +122,7 @@ namespace Microsoft.AspNetCore.Mvc.Internal
return validators;
}
- private struct CacheEntry
+ private readonly struct CacheEntry
{
public CacheEntry(IReadOnlyList validators)
{
diff --git a/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/Metadata/DefaultModelMetadataProvider.cs b/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/Metadata/DefaultModelMetadataProvider.cs
index b9e374701e..75bd188997 100644
--- a/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/Metadata/DefaultModelMetadataProvider.cs
+++ b/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/Metadata/DefaultModelMetadataProvider.cs
@@ -345,7 +345,7 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding.Metadata
{
}
- private struct ModelMetadataCacheEntry
+ private readonly struct ModelMetadataCacheEntry
{
public ModelMetadataCacheEntry(ModelMetadata metadata, DefaultMetadataDetails details)
{
diff --git a/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/ModelBinderFactory.cs b/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/ModelBinderFactory.cs
index 08e6883dd8..4b7a53b498 100644
--- a/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/ModelBinderFactory.cs
+++ b/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/ModelBinderFactory.cs
@@ -310,7 +310,7 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding
// the ParameterDescriptor) or in a call to TryUpdateModel (no BindingInfo) or as a collection element.
//
// We need to be able to tell the difference between these things to avoid over-caching.
- private struct Key : IEquatable
+ private readonly struct Key : IEquatable
{
private readonly ModelMetadata _metadata;
private readonly object _token; // Explicitly using ReferenceEquality for tokens.
diff --git a/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/Validation/ValidationVisitor.cs b/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/Validation/ValidationVisitor.cs
index 43c385ec7b..fa467588a8 100644
--- a/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/Validation/ValidationVisitor.cs
+++ b/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/Validation/ValidationVisitor.cs
@@ -318,7 +318,7 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding.Validation
return entry;
}
- protected struct StateManager : IDisposable
+ protected readonly struct StateManager : IDisposable
{
private readonly ValidationVisitor _visitor;
private readonly object _container;
diff --git a/src/Microsoft.AspNetCore.Mvc.Razor/Internal/ViewLocationCacheItem.cs b/src/Microsoft.AspNetCore.Mvc.Razor/Internal/ViewLocationCacheItem.cs
index 23fe788101..64333eb02f 100644
--- a/src/Microsoft.AspNetCore.Mvc.Razor/Internal/ViewLocationCacheItem.cs
+++ b/src/Microsoft.AspNetCore.Mvc.Razor/Internal/ViewLocationCacheItem.cs
@@ -8,7 +8,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
///
/// An item in .
///
- public struct ViewLocationCacheItem
+ public readonly struct ViewLocationCacheItem
{
///
/// Initializes a new instance of .
diff --git a/src/Microsoft.AspNetCore.Mvc.Razor/Internal/ViewLocationCacheKey.cs b/src/Microsoft.AspNetCore.Mvc.Razor/Internal/ViewLocationCacheKey.cs
index 7643882f79..00f3d3c8ec 100644
--- a/src/Microsoft.AspNetCore.Mvc.Razor/Internal/ViewLocationCacheKey.cs
+++ b/src/Microsoft.AspNetCore.Mvc.Razor/Internal/ViewLocationCacheKey.cs
@@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
///
/// Key for entries in .
///
- public struct ViewLocationCacheKey : IEquatable
+ public readonly struct ViewLocationCacheKey : IEquatable
{
///
/// Initializes a new instance of .
diff --git a/src/Microsoft.AspNetCore.Mvc.Razor/RazorPageFactoryResult.cs b/src/Microsoft.AspNetCore.Mvc.Razor/RazorPageFactoryResult.cs
index 31f7b1ce94..45537550f7 100644
--- a/src/Microsoft.AspNetCore.Mvc.Razor/RazorPageFactoryResult.cs
+++ b/src/Microsoft.AspNetCore.Mvc.Razor/RazorPageFactoryResult.cs
@@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor
///
/// Result of .
///
- public struct RazorPageFactoryResult
+ public readonly struct RazorPageFactoryResult
{
///
/// Initializes a new instance of with the
diff --git a/src/Microsoft.AspNetCore.Mvc.Razor/RazorPageResult.cs b/src/Microsoft.AspNetCore.Mvc.Razor/RazorPageResult.cs
index c299e350fe..044e3ee581 100644
--- a/src/Microsoft.AspNetCore.Mvc.Razor/RazorPageResult.cs
+++ b/src/Microsoft.AspNetCore.Mvc.Razor/RazorPageResult.cs
@@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor
///
/// Result of locating a .
///
- public struct RazorPageResult
+ public readonly struct RazorPageResult
{
///
/// Initializes a new instance of for a successful discovery.
diff --git a/src/Microsoft.AspNetCore.Mvc.RazorPages/Internal/PageBinderFactory.cs b/src/Microsoft.AspNetCore.Mvc.RazorPages/Internal/PageBinderFactory.cs
index 6fcc9e08c8..72fd33d754 100644
--- a/src/Microsoft.AspNetCore.Mvc.RazorPages/Internal/PageBinderFactory.cs
+++ b/src/Microsoft.AspNetCore.Mvc.RazorPages/Internal/PageBinderFactory.cs
@@ -163,7 +163,7 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Internal
}
}
- private struct BinderItem
+ private readonly struct BinderItem
{
public BinderItem(IModelBinder modelBinder, ModelMetadata modelMetadata)
{
diff --git a/src/Microsoft.AspNetCore.Mvc.TagHelpers/Internal/GlobbingUrlBuilder.cs b/src/Microsoft.AspNetCore.Mvc.TagHelpers/Internal/GlobbingUrlBuilder.cs
index 9b756848a1..ce891ad84e 100644
--- a/src/Microsoft.AspNetCore.Mvc.TagHelpers/Internal/GlobbingUrlBuilder.cs
+++ b/src/Microsoft.AspNetCore.Mvc.TagHelpers/Internal/GlobbingUrlBuilder.cs
@@ -352,7 +352,7 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers.Internal
return new StringSegment(value.Buffer, offset, trimmedEnd - offset + 1);
}
- private struct GlobbingUrlKey : IEquatable
+ private readonly struct GlobbingUrlKey : IEquatable
{
public GlobbingUrlKey(string include, string exclude)
{
diff --git a/src/Microsoft.AspNetCore.Mvc.ViewFeatures/Internal/ViewBufferValue.cs b/src/Microsoft.AspNetCore.Mvc.ViewFeatures/Internal/ViewBufferValue.cs
index 89c9581848..68691a9868 100644
--- a/src/Microsoft.AspNetCore.Mvc.ViewFeatures/Internal/ViewBufferValue.cs
+++ b/src/Microsoft.AspNetCore.Mvc.ViewFeatures/Internal/ViewBufferValue.cs
@@ -12,7 +12,7 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Internal
/// Encapsulates a string or value.
///
[DebuggerDisplay("{DebuggerToString()}")]
- public struct ViewBufferValue
+ public readonly struct ViewBufferValue
{
///
/// Initializes a new instance of with a string value.
@@ -41,15 +41,13 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Internal
{
using (var writer = new StringWriter())
{
- var valueAsString = Value as string;
- if (valueAsString != null)
+ if (Value is string valueAsString)
{
writer.Write(valueAsString);
return writer.ToString();
}
- var valueAsContent = Value as IHtmlContent;
- if (valueAsContent != null)
+ if (Value is IHtmlContent valueAsContent)
{
valueAsContent.WriteTo(writer, HtmlEncoder.Default);
return writer.ToString();
diff --git a/src/Microsoft.AspNetCore.Mvc.ViewFeatures/ViewFeatures/MemberExpressionCacheKey.cs b/src/Microsoft.AspNetCore.Mvc.ViewFeatures/ViewFeatures/MemberExpressionCacheKey.cs
index 1cbc80c38a..8f8b667983 100644
--- a/src/Microsoft.AspNetCore.Mvc.ViewFeatures/ViewFeatures/MemberExpressionCacheKey.cs
+++ b/src/Microsoft.AspNetCore.Mvc.ViewFeatures/ViewFeatures/MemberExpressionCacheKey.cs
@@ -8,7 +8,7 @@ using System.Reflection;
namespace Microsoft.AspNetCore.Mvc.ViewFeatures
{
- internal struct MemberExpressionCacheKey
+ internal readonly struct MemberExpressionCacheKey
{
public MemberExpressionCacheKey(Type modelType, MemberExpression memberExpression)
{
@@ -44,7 +44,7 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures
public MemberInfo[] Members { get; }
- public Enumerator GetEnumerator() => new Enumerator(ref this);
+ public Enumerator GetEnumerator() => new Enumerator(this);
public struct Enumerator
{
@@ -52,7 +52,7 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures
private int _index;
private MemberExpression _memberExpression;
- public Enumerator(ref MemberExpressionCacheKey key)
+ public Enumerator(in MemberExpressionCacheKey key)
{
Current = null;
_members = key.Members;