diff --git a/src/NetAnalyzers/Core/Microsoft.NetCore.Analyzers/Runtime/DoNotCallEnumerableCastOrOfTypeWithIncompatibleTypesAnalyzer.cs b/src/NetAnalyzers/Core/Microsoft.NetCore.Analyzers/Runtime/DoNotCallEnumerableCastOrOfTypeWithIncompatibleTypesAnalyzer.cs
index 4272e672a4..84e3d40c3a 100644
--- a/src/NetAnalyzers/Core/Microsoft.NetCore.Analyzers/Runtime/DoNotCallEnumerableCastOrOfTypeWithIncompatibleTypesAnalyzer.cs
+++ b/src/NetAnalyzers/Core/Microsoft.NetCore.Analyzers/Runtime/DoNotCallEnumerableCastOrOfTypeWithIncompatibleTypesAnalyzer.cs
@@ -10,6 +10,8 @@
namespace Microsoft.NetCore.Analyzers.Runtime
{
+ using static MicrosoftNetCoreAnalyzersResources;
+
///
/// CA2021: Do not call Enumerable.Cast or Enumerable.OfType with incompatible types.
///
@@ -18,11 +20,11 @@ public sealed class DoNotCallEnumerableCastOrOfTypeWithIncompatibleTypesAnalyzer
{
internal const string RuleId = "CA2021";
- private static readonly LocalizableString s_localizableTitle = new LocalizableResourceString(nameof(MicrosoftNetCoreAnalyzersResources.DoNotCallEnumerableCastOrOfTypeWithIncompatibleTypesTitle), MicrosoftNetCoreAnalyzersResources.ResourceManager, typeof(MicrosoftNetCoreAnalyzersResources));
- private static readonly LocalizableString s_localizableDescription = new LocalizableResourceString(nameof(MicrosoftNetCoreAnalyzersResources.DoNotCallEnumerableCastOrOfTypeWithIncompatibleTypesDescription), MicrosoftNetCoreAnalyzersResources.ResourceManager, typeof(MicrosoftNetCoreAnalyzersResources));
+ private static readonly LocalizableString s_localizableTitle = CreateLocalizableResourceString(nameof(DoNotCallEnumerableCastOrOfTypeWithIncompatibleTypesTitle));
+ private static readonly LocalizableString s_localizableDescription = CreateLocalizableResourceString(nameof(DoNotCallEnumerableCastOrOfTypeWithIncompatibleTypesDescription));
- private static readonly LocalizableString s_localizableCastMessage = new LocalizableResourceString(nameof(MicrosoftNetCoreAnalyzersResources.DoNotCallEnumerableCastOrOfTypeWithIncompatibleTypesMessageCast), MicrosoftNetCoreAnalyzersResources.ResourceManager, typeof(MicrosoftNetCoreAnalyzersResources));
- private static readonly LocalizableString s_localizableOfTypeMessage = new LocalizableResourceString(nameof(MicrosoftNetCoreAnalyzersResources.DoNotCallEnumerableCastOrOfTypeWithIncompatibleTypesMessageOfType), MicrosoftNetCoreAnalyzersResources.ResourceManager, typeof(MicrosoftNetCoreAnalyzersResources));
+ private static readonly LocalizableString s_localizableCastMessage = CreateLocalizableResourceString(nameof(DoNotCallEnumerableCastOrOfTypeWithIncompatibleTypesMessageCast));
+ private static readonly LocalizableString s_localizableOfTypeMessage = CreateLocalizableResourceString(nameof(DoNotCallEnumerableCastOrOfTypeWithIncompatibleTypesMessageOfType));
internal static DiagnosticDescriptor CastRule = DiagnosticDescriptorHelper.Create(RuleId,
s_localizableTitle,
@@ -47,8 +49,8 @@ public sealed class DoNotCallEnumerableCastOrOfTypeWithIncompatibleTypesAnalyzer
(nameof(Enumerable.OfType), OfTypeRule)
);
- public override ImmutableArray SupportedDiagnostics
- => ImmutableArray.Create(OfTypeRule, CastRule);
+ public override ImmutableArray SupportedDiagnostics { get; }
+ = ImmutableArray.Create(OfTypeRule, CastRule);
public override void Initialize(AnalysisContext context)
{
@@ -195,6 +197,7 @@ static ITypeSymbol UnwrapNullableValueType(ITypeSymbol typeSymbol)
{
return nullableTypeArgument;
}
+
return typeSymbol;
}
@@ -231,6 +234,7 @@ static bool IsUnconstrainedTypeParameter(ITypeParameterSymbol typeParameterSymbo
{
return true;
}
+
return false;
case (_, TypeKind.TypeParameter):
var castToTypeParam = (ITypeParameterSymbol)castTo.OriginalDefinition;
@@ -249,6 +253,7 @@ static bool IsUnconstrainedTypeParameter(ITypeParameterSymbol typeParameterSymbo
{
return true;
}
+
return false;
case (TypeKind.Class, TypeKind.Class):
@@ -261,11 +266,11 @@ static bool IsUnconstrainedTypeParameter(ITypeParameterSymbol typeParameterSymbo
return castFrom.IsSealed && !castFrom.AllInterfaces.Contains(castTo);
case (TypeKind.Class, TypeKind.Enum):
- return castFrom.OriginalDefinition.SpecialType != SpecialType.System_Enum
- && castFrom.OriginalDefinition.SpecialType != SpecialType.System_ValueType;
+ return castFrom.OriginalDefinition.SpecialType is not SpecialType.System_Enum
+ and not SpecialType.System_ValueType;
case (TypeKind.Enum, TypeKind.Class):
- return castTo.OriginalDefinition.SpecialType != SpecialType.System_Enum
- && castTo.OriginalDefinition.SpecialType != SpecialType.System_ValueType;
+ return castTo.OriginalDefinition.SpecialType is not (SpecialType.System_Enum
+ and not SpecialType.System_ValueType);
case (TypeKind.Struct, TypeKind.Enum)
when castTo.OriginalDefinition is INamedTypeSymbol toEnum:
diff --git a/src/NetAnalyzers/UnitTests/Microsoft.NetCore.Analyzers/Runtime/DoNotCallEnumerableCastOrOfTypeWithIncompatibleTypesAnalyzerTests.cs b/src/NetAnalyzers/UnitTests/Microsoft.NetCore.Analyzers/Runtime/DoNotCallEnumerableCastOrOfTypeWithIncompatibleTypesAnalyzerTests.cs
index e4390ffb88..6d2faf82d4 100644
--- a/src/NetAnalyzers/UnitTests/Microsoft.NetCore.Analyzers/Runtime/DoNotCallEnumerableCastOrOfTypeWithIncompatibleTypesAnalyzerTests.cs
+++ b/src/NetAnalyzers/UnitTests/Microsoft.NetCore.Analyzers/Runtime/DoNotCallEnumerableCastOrOfTypeWithIncompatibleTypesAnalyzerTests.cs
@@ -4,7 +4,6 @@
using System.Linq;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis;
-using Microsoft.CodeAnalysis.Testing;
using Xunit;
using VerifyCS = Test.Utilities.CSharpCodeFixVerifier<
Microsoft.NetCore.Analyzers.Runtime.DoNotCallEnumerableCastOrOfTypeWithIncompatibleTypesAnalyzer,
diff --git a/src/Utilities/Compiler/DiagnosticCategoryAndIdRanges.txt b/src/Utilities/Compiler/DiagnosticCategoryAndIdRanges.txt
index ed679ecdfe..8641989f9e 100644
--- a/src/Utilities/Compiler/DiagnosticCategoryAndIdRanges.txt
+++ b/src/Utilities/Compiler/DiagnosticCategoryAndIdRanges.txt
@@ -18,7 +18,7 @@ Usage: CA1801, CA1806, CA1816, CA2200-CA2209, CA2211-CA2260
Naming: CA1700-CA1727
Interoperability: CA1400-CA1422
Maintainability: CA1500-CA1513
-Reliability: CA9998-CA9999, CA2000-CA2020
+Reliability: CA9998-CA9999, CA2000-CA2021
Documentation: CA1200-CA1200
# Microsoft CodeAnalysis API rules