提交 1ef524d8 编写于 作者: N Neal Gafter

Merge pull request #1152 from gafter/fix406

Detect and report attempt to use abstract event through base
......@@ -1752,7 +1752,12 @@ private bool CheckEventValueKind(BoundEventAccess boundEvent, BindValueKind valu
// NOTE: availability of well-known members is checked in BindEventAssignment because
// we don't have the context to determine whether addition or subtraction is being performed.
if (ReportUseSiteDiagnostics(eventSymbol, diagnostics, eventSyntax))
if (receiver?.Kind == BoundKind.BaseReference && eventSymbol.IsAbstract)
{
Error(diagnostics, ErrorCode.ERR_AbstractBaseCall, boundEvent.Syntax, eventSymbol);
return false;
}
else if (ReportUseSiteDiagnostics(eventSymbol, diagnostics, eventSyntax))
{
// NOTE: BindEventAssignment checks use site errors on the specific accessor
// (since we don't know which is being used).
......
......@@ -1884,6 +1884,55 @@ public abstract class A
Assert.NotNull(eventF.AssociatedField); // Since it has an initializer.
}
[Fact, WorkItem(406, "https://github.com/dotnet/roslyn/issues/406")]
public void AbstractBaseEvent()
{
var source =
@"using System;
namespace ConsoleApplication3
{
public abstract class BaseWithAbstractEvent
{
public abstract event Action MyEvent;
}
public class SuperWithOverridenEvent : BaseWithAbstractEvent
{
public override event Action MyEvent
{
add { base.MyEvent += value; } // error
remove { base.MyEvent -= value; } // error
}
public void Foo()
{
base.MyEvent += Foo; // error
}
}
class Program
{
static void Main()
{
SuperWithOverridenEvent swoe = new SuperWithOverridenEvent();
swoe.MyEvent += Main;
}
}
}";
CreateCompilationWithMscorlib(source).VerifyDiagnostics(
// (14,19): error CS0205: Cannot call an abstract base member: 'BaseWithAbstractEvent.MyEvent'
// add { base.MyEvent += value; } // error
Diagnostic(ErrorCode.ERR_AbstractBaseCall, "base.MyEvent").WithArguments("ConsoleApplication3.BaseWithAbstractEvent.MyEvent").WithLocation(14, 19),
// (15,22): error CS0205: Cannot call an abstract base member: 'BaseWithAbstractEvent.MyEvent'
// remove { base.MyEvent -= value; } // error
Diagnostic(ErrorCode.ERR_AbstractBaseCall, "base.MyEvent").WithArguments("ConsoleApplication3.BaseWithAbstractEvent.MyEvent").WithLocation(15, 22),
// (20,13): error CS0205: Cannot call an abstract base member: 'BaseWithAbstractEvent.MyEvent'
// base.MyEvent += Foo; // error
Diagnostic(ErrorCode.ERR_AbstractBaseCall, "base.MyEvent").WithArguments("ConsoleApplication3.BaseWithAbstractEvent.MyEvent").WithLocation(20, 13)
);
}
#endregion
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册