When a base type explicitly implements a public interface method, that method is only accessible in derived types through a reference to the
current instance (namely this). If the derived type explicitly overrides that interface method, the base implementation becomes
inaccessible.
This rule raises an issue when an unsealed, externally visible type provides an explicit method implementation of a public interface
and does not provide an alternate, externally visible method with the same name.
public interface IMyInterface
{
void MyMethod();
}
public class Foo : IMyInterface
{
void IMyInterface.MyMethod() // Noncompliant
{
MyMethod();
}
void MyMethod()
{
// Do something ...
}
}
public class Bar : Foo, IMyInterface
{
public void MyMethod()
{
// Can't access base.MyMethod()
// ((IMyInterface)this).MyMethod() would be a recursive call
}
}
public interface IMyInterface
{
void MyMethod();
}
public class Foo : IMyInterface
{
void IMyInterface.MyMethod()
{
MyMethod();
}
protected void MyMethod() // or public
{
// Do something ...
}
}
public class Bar : Foo, IMyInterface
{
public void MyMethod()
{
// Do something
base.MyMethod();
}
}
This rule does not report a violation for an explicit implementation of IDisposable.Dispose when an externally visible
Close() or System.IDisposable.Dispose(Boolean) method is provided.