diff --git a/ChangeLog.md b/ChangeLog.md index 9131077702..d4be0aa92f 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Fixed + +- Fix analyzer [RCS1172](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS1172) ([PR](https://github.com/dotnet/roslynator/pull/1710)) + ## [4.14.1] - 2025-10-05 ### Added diff --git a/src/Analyzers/CSharp/Analysis/UseIsOperatorInsteadOfAsOperatorAnalyzer.cs b/src/Analyzers/CSharp/Analysis/UseIsOperatorInsteadOfAsOperatorAnalyzer.cs index a32cc24ffe..9034110fd9 100644 --- a/src/Analyzers/CSharp/Analysis/UseIsOperatorInsteadOfAsOperatorAnalyzer.cs +++ b/src/Analyzers/CSharp/Analysis/UseIsOperatorInsteadOfAsOperatorAnalyzer.cs @@ -58,6 +58,15 @@ private static void Analyze(SyntaxNodeAnalysisContext context, SyntaxNode node) if (!nullCheck.Success) return; + if ((nullCheck.Style & NullCheckStyles.ComparisonToNull) != NullCheckStyles.None + && context.SemanticModel + .GetMethodSymbol(nullCheck.NullCheckExpression)? + .ContainingType? + .SpecialType != SpecialType.System_Object) + { + return; + } + AsExpressionInfo asExpressionInfo = SyntaxInfo.AsExpressionInfo(nullCheck.Expression); if (!asExpressionInfo.Success) diff --git a/src/Tests/Analyzers.Tests/RCS1172UseIsOperatorInsteadOfAsOperatorTests.cs b/src/Tests/Analyzers.Tests/RCS1172UseIsOperatorInsteadOfAsOperatorTests.cs index 1edc9a0ae1..4a44b31413 100644 --- a/src/Tests/Analyzers.Tests/RCS1172UseIsOperatorInsteadOfAsOperatorTests.cs +++ b/src/Tests/Analyzers.Tests/RCS1172UseIsOperatorInsteadOfAsOperatorTests.cs @@ -33,6 +33,28 @@ void M(object item) } } } +"); + } + + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.UseIsOperatorInsteadOfAsOperator)] + public async Task TestNoDiagnostic_OverloadedEqualityOperator() + { + await VerifyNoDiagnosticAsync(@" +internal class C +{ + public static implicit operator C(int i) => new C(); + public static bool operator ==(C left, C right) => default; + public static bool operator !=(C left, C right) => default; + public override bool Equals(object obj) => default; + public override int GetHashCode() => default; + + void M(object x) + { + if (x as C != null) + { + } + } +} "); } }