diff --git a/src/EditorFeatures/CSharpTest/UsePatternMatching/CSharpAsAndNullCheckTests.cs b/src/EditorFeatures/CSharpTest/UsePatternMatching/CSharpAsAndNullCheckTests.cs index f514b7cbe0b0793ee260c764d7e6c519c5e59ccb..6170954f319e071c750faf62f771628cddd53627 100644 --- a/src/EditorFeatures/CSharpTest/UsePatternMatching/CSharpAsAndNullCheckTests.cs +++ b/src/EditorFeatures/CSharpTest/UsePatternMatching/CSharpAsAndNullCheckTests.cs @@ -726,6 +726,23 @@ void M() { } } +}"); + } + + [WorkItem(21172, "https://github.com/dotnet/roslyn/issues/21172")] + [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInlineTypeCheck)] + public async Task TestMissingWithDynamic() + { + await TestMissingAsync( +@"class C +{ + void M(object o) + { + [|var|] x = o as dynamic; + if (x != null) + { + } + } }"); } } diff --git a/src/EditorFeatures/CSharpTest/UsePatternMatching/CSharpIsAndCastCheckDiagnosticAnalyzerTests.cs b/src/EditorFeatures/CSharpTest/UsePatternMatching/CSharpIsAndCastCheckDiagnosticAnalyzerTests.cs index 7f16164a55d6bb01df2f7bdc0a7fbf2c34db0fc0..90a9d1d5be3c9976f75726f4f6b5e050c2fa4b55 100644 --- a/src/EditorFeatures/CSharpTest/UsePatternMatching/CSharpIsAndCastCheckDiagnosticAnalyzerTests.cs +++ b/src/EditorFeatures/CSharpTest/UsePatternMatching/CSharpIsAndCastCheckDiagnosticAnalyzerTests.cs @@ -538,5 +538,25 @@ public object Convert(object value) } }"); } + + [WorkItem(21172, "https://github.com/dotnet/roslyn/issues/21172")] + [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInlineTypeCheck)] + public async Task TestMissingWithDynamic() + { + await TestMissingInRegularAndScriptAsync( +@" +class C +{ + public object Convert(object value) + { + if (value is dynamic) + { + [|dynamic|] tmp = (dynamic)value; + } + + return null; + } +}"); + } } } diff --git a/src/Features/CSharp/Portable/UsePatternMatching/CSharpAsAndNullCheckDiagnosticAnalyzer.cs b/src/Features/CSharp/Portable/UsePatternMatching/CSharpAsAndNullCheckDiagnosticAnalyzer.cs index 33733171a2dbbd43280e266ddd0b79e60a0b61f0..2a8fe989e9a61f0f8bc4aa431313e2d98c110570 100644 --- a/src/Features/CSharp/Portable/UsePatternMatching/CSharpAsAndNullCheckDiagnosticAnalyzer.cs +++ b/src/Features/CSharp/Portable/UsePatternMatching/CSharpAsAndNullCheckDiagnosticAnalyzer.cs @@ -103,6 +103,12 @@ private void SyntaxNodeAction(SyntaxNodeAnalysisContext syntaxContext) return; } + if (asType?.TypeKind == TypeKind.Dynamic) + { + // Not legal to use dynamic in a pattern. + return; + } + var localSymbol = (ILocalSymbol)semanticModel.GetDeclaredSymbol(declarator); if (!localSymbol.Type.Equals(asType)) { diff --git a/src/Features/CSharp/Portable/UsePatternMatching/CSharpIsAndCastCheckDiagnosticAnalyzer.cs b/src/Features/CSharp/Portable/UsePatternMatching/CSharpIsAndCastCheckDiagnosticAnalyzer.cs index 1428762ef9a679bd7bcc047a2b06ea5c9e46c711..1d8249673bd5717d91d7be927ee2de94f7dd37f1 100644 --- a/src/Features/CSharp/Portable/UsePatternMatching/CSharpIsAndCastCheckDiagnosticAnalyzer.cs +++ b/src/Features/CSharp/Portable/UsePatternMatching/CSharpIsAndCastCheckDiagnosticAnalyzer.cs @@ -112,6 +112,12 @@ private void SyntaxNodeAction(SyntaxNodeAnalysisContext syntaxContext) return; } + if (isType?.TypeKind == TypeKind.Dynamic) + { + // Not legal to use dynamic in a pattern. + return; + } + if (!localSymbol.Type.Equals(isType)) { // we have something like: