diff --git a/docs/csharp/language-reference/keywords/protected-internal.md b/docs/csharp/language-reference/keywords/protected-internal.md index 790b59043041d..91768bf815857 100644 --- a/docs/csharp/language-reference/keywords/protected-internal.md +++ b/docs/csharp/language-reference/keywords/protected-internal.md @@ -58,6 +58,48 @@ In the second file, an attempt to access `myValue` through an instance of `BaseC Struct members cannot be `protected internal` because the struct cannot be inherited. +## Overriding protected internal members + +When overriding a virtual member, the accessibility modifier of the overridden method depends on the assembly where the derived class is defined. + +When the derived class is defined in the same assembly as the base class, all overridden members have `protected internal` access. If the derived class is defined in a different assembly from the base class, overridden members have `protected` access. + +```csharp +// Assembly1.cs +// Compile with: /target:library +public class BaseClass +{ + protected internal virtual int GetExampleValue() + { + return 5; + } +} + +public class DerivedClassSameAssembly : BaseClass +{ + // Override to return a different example value, accessibility modifiers remain the same. + protected internal override int GetExampleValue() + { + return 9; + } +} +``` + +```csharp +// Assembly2.cs +// Compile with: /reference:Assembly1.dll +class DerivedClassDifferentAssembly : BaseClass +{ + // Override to return a different example value, since this override + // method is defined in another assembly, the accessibility modifiers + // are only protected, instead of protected internal. + protected override int GetExampleValue() + { + return 2; + } +} +``` + ## C# language specification [!INCLUDE[CSharplangspec](~/includes/csharplangspec-md.md)]