diff --git a/src/Compilers/CSharp/Portable/Binder/Binder_Expressions.cs b/src/Compilers/CSharp/Portable/Binder/Binder_Expressions.cs index b0228beca229abbf2aff226347e173f2609b2460..f2be62e313786582568359089fcfdc3e0a00bf46 100644 --- a/src/Compilers/CSharp/Portable/Binder/Binder_Expressions.cs +++ b/src/Compilers/CSharp/Portable/Binder/Binder_Expressions.cs @@ -1784,7 +1784,10 @@ private BoundExpression BindCastCore(ExpressionSyntax node, BoundExpression oper ImmutableArray originalUserDefinedConversions = conversion.OriginalUserDefinedConversions; if (originalUserDefinedConversions.Length > 1) { - diagnostics.Add(ErrorCode.ERR_AmbigUDConv, syntax.Location, originalUserDefinedConversions[0], originalUserDefinedConversions[1], operand.Type, targetType); + // Method groups always have null types + var operandType = (operand.Kind == BoundKind.MethodGroup) ? (object)MessageID.IDS_SK_METHOD.Localize() : operand.Type; + + diagnostics.Add(ErrorCode.ERR_AmbigUDConv, syntax.Location, originalUserDefinedConversions[0], originalUserDefinedConversions[1], operandType, targetType); } else { diff --git a/src/Compilers/CSharp/Test/Semantic/Semantics/MethodBodyModelTests.cs b/src/Compilers/CSharp/Test/Semantic/Semantics/MethodBodyModelTests.cs index 790258a848741f53ccb94e5b1624698dfaedd63b..20f606803437e811e2482edc020f11daeffa357b 100644 --- a/src/Compilers/CSharp/Test/Semantic/Semantics/MethodBodyModelTests.cs +++ b/src/Compilers/CSharp/Test/Semantic/Semantics/MethodBodyModelTests.cs @@ -956,5 +956,43 @@ public Inner(int xyzzy) Diagnostic(ErrorCode.ERR_ObjectRequired, "f1").WithArguments("Outer.f1").WithLocation(10, 21) ); } + + [Fact, WorkItem(8556, "https://github.com/dotnet/roslyn/issues/8556")] + public void CastAmbiguousMethodGroupTypeProducesCorrectErrorMessage() + { + var text = @" +using System; + +public delegate void Foo (); + +class D +{ + public static implicit operator D (Action d) + { + return new D (); + } + + public static explicit operator D (Foo d) + { + return new D (); + } +} + +class Program +{ + static void Main() + { + D d = (D) Main; + } +} +"; + var tree = Parse(text); + var comp = CreateCompilationWithMscorlib(tree); + comp.GetMethodBodyDiagnostics().Verify( + // (23,15): error CS0457: Ambiguous user defined conversions 'D.explicit operator D(Foo)' and 'D.implicit operator D(Action)' when converting from 'method' to 'D' + // D d = (D) Main; + Diagnostic(ErrorCode.ERR_AmbigUDConv, "(D) Main").WithArguments("D.explicit operator D(Foo)", "D.implicit operator D(System.Action)", "method", "D").WithLocation(23, 15) + ); + } } }