== Why is this an issue? Decreasing the https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/access-modifiers[accessibility level] of an inherited method that is not https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/override[overridable] to https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/private[private] will shadow the name of the base method and can lead to confusion. [source,csharp] ---- public class Base { public void SomeMethod(int count) { } } public class Derived : Base { private void SomeMethod(int count) { } // Noncompliant } class Program { public void DoWork() { var derived = new Derived(); derived.SomeMethod(42); // Base.SomeMethod is accessed here } } ---- Another potential problem is the case of a class deriving from `Derived` and accessing `SomeMethod`. In this scenario, the method accessed will instead be the `Base` implementation, which might not be what was expected. [source,csharp] ---- public class Base { public void SomeMethod(int count) { } } public class Derived : Base { private void SomeMethod(int count) { } // Noncompliant } public class SecondDerived : Derived { public void DoWork() { SomeMethod(42); // Base.SomeMethod is accessed here } } ---- One way to mitigate this, is by sealing the `Derived` class by using the https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/sealed[sealed] modifier, thus preventing inheritance from this point on. [source,csharp] ---- public class Base { public void SomeMethod(int count) { } } public sealed class Derived : Base { private void SomeMethod(int count) { } // Compliant: class is marked as sealed } ---- Another way to mitigate this, is by having the `Derived` implementation match the https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/access-modifiers[accessibility] modifier of the `Base` implementation of `SomeMethod`. From a caller's perspective, this is closer to the expected behavior. [source,csharp] ---- using System; namespace MyLibrary { public class Base { public void SomeMethod(int count) { } } public class Derived : Base { public void SomeMethod(int count) { } // Compliant: same accessibility as Base.SomeMethod } public class Program { public void DoWork() { var derived = new Derived(); derived.SomeMethod(42); // Derived.SomeMethod is called } } } ---- Last but not least, consider using a different name for the `Derived` method, thus completely eliminating any confusion caused by the naming collision. [source,csharp] ---- public class Base { public void SomeMethod(int count) { } } public class Derived : Base { private void SomeOtherMethod(int count) { } // Compliant } ---- include::../resources.adoc[] include::../rspecator.adoc[]