diff --git a/src/Microsoft.VisualStudio.Threading.Analyzers.CSharp/VSTHRD103UseAsyncOptionAnalyzer.cs b/src/Microsoft.VisualStudio.Threading.Analyzers.CSharp/VSTHRD103UseAsyncOptionAnalyzer.cs index 46cde9c5a..e269989d1 100644 --- a/src/Microsoft.VisualStudio.Threading.Analyzers.CSharp/VSTHRD103UseAsyncOptionAnalyzer.cs +++ b/src/Microsoft.VisualStudio.Threading.Analyzers.CSharp/VSTHRD103UseAsyncOptionAnalyzer.cs @@ -163,7 +163,12 @@ internal static void AnalyzeInvocation(SyntaxNodeAnalysisContext context) /// private static bool HasSupersetOfParameterTypes(IMethodSymbol candidateMethod, IMethodSymbol baselineMethod) { - return candidateMethod.Parameters.All(candidateParameter => baselineMethod.Parameters.Any(baselineParameter => baselineParameter.Type?.Equals(candidateParameter.Type, SymbolEqualityComparer.Default) ?? false)); + if (baselineMethod.Parameters.Length > candidateMethod.Parameters.Length) + { + return false; + } + + return baselineMethod.Parameters.All(baselineParameter => candidateMethod.Parameters.Any(candidateParameter => baselineParameter.Type?.Equals(candidateParameter.Type, SymbolEqualityComparer.Default) ?? false)); } private static bool IsInTaskReturningMethodOrDelegate(SyntaxNodeAnalysisContext context) diff --git a/test/Microsoft.VisualStudio.Threading.Analyzers.Tests/VSTHRD103UseAsyncOptionAnalyzerTests.cs b/test/Microsoft.VisualStudio.Threading.Analyzers.Tests/VSTHRD103UseAsyncOptionAnalyzerTests.cs index b4ff2da62..6eca41811 100644 --- a/test/Microsoft.VisualStudio.Threading.Analyzers.Tests/VSTHRD103UseAsyncOptionAnalyzerTests.cs +++ b/test/Microsoft.VisualStudio.Threading.Analyzers.Tests/VSTHRD103UseAsyncOptionAnalyzerTests.cs @@ -1339,6 +1339,30 @@ void Bar() {} await CSVerify.VerifyAnalyzerAsync(test); } + [Fact] + public async Task DoNotRaiseForDistinctSyncMethod() + { + string test = @" +using System.Threading.Tasks; + +class SomeClass { + Task Method(){ + Bar(10, 11); + return Task.CompletedTask; + } + + Task Foo() => Task.FromResult(11); + async Task BarAsync(int id) { + var number = await Foo(); + return Bar(id, number); + } + int Bar(int id, int number) => id * number; +} +"; + + await CSVerify.VerifyAnalyzerAsync(test); + } + private DiagnosticResult CreateDiagnostic(int line, int column, int length, string methodName) => CSVerify.Diagnostic(DescriptorNoAlternativeMethod).WithSpan(line, column, line, column + length).WithArguments(methodName);