提交 b5ba57ca 编写于 作者: O Omar Tawfik 提交者: GitHub

Merge pull request #14463 from OmarTawfik/fix-8556-nre-on-method-group-cast

Fix printing ambiguous method group types on invalid casts
...@@ -1784,7 +1784,10 @@ private BoundExpression BindCastCore(ExpressionSyntax node, BoundExpression oper ...@@ -1784,7 +1784,10 @@ private BoundExpression BindCastCore(ExpressionSyntax node, BoundExpression oper
ImmutableArray<MethodSymbol> originalUserDefinedConversions = conversion.OriginalUserDefinedConversions; ImmutableArray<MethodSymbol> originalUserDefinedConversions = conversion.OriginalUserDefinedConversions;
if (originalUserDefinedConversions.Length > 1) 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 else
{ {
......
...@@ -956,5 +956,43 @@ public Inner(int xyzzy) ...@@ -956,5 +956,43 @@ public Inner(int xyzzy)
Diagnostic(ErrorCode.ERR_ObjectRequired, "f1").WithArguments("Outer.f1").WithLocation(10, 21) 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)
);
}
} }
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册