З ECMA 335 , розділ 8.10.4 розділу 1:
CTS забезпечує незалежний контроль як над іменами, які видно з базового типу (приховування), так і над спільним використанням слотів макета у похідному класі (перевизначення). Приховування контролюється шляхом позначення члена у похідному класі як приховування за іменем, або приховування за іменем та підписом. Приховування завжди виконується на основі виду члена, тобто похідні імена полів можуть приховувати імена базових полів, але не імена методів, імена властивостей або назви подій. Якщо похідний член позначений сховати за іменем, тоді члени одного типу в базовому класі з однаковим іменем не будуть видимі в похідному класі; якщо учасник позначений як приховувати за іменем та підписом, тоді від похідного класу приховується лише той самий член із точно однаковим іменем та типом (для полів) або підпис методу (для методів). Здійснення відмінності між цими двома формами приховування забезпечується повністю компіляторами мови джерела та бібліотекою роздумів; це не має прямого впливу на саму VES.
(Це не одразу зрозуміло з цього, але hidebysig
означає "приховати ім'ям та підписом".)
Також у розділі 15.4.2.2 розділу 2:
hidebysig надається для використання інструментів і VES ігнорує. Він вказує, що оголошений метод приховує всі методи базових типів класів, які мають відповідний підпис методу; якщо опущено, метод повинен приховувати всі методи з однаковим іменем, незалежно від підпису.
Як приклад, припустимо, у вас є:
public class Base
{
public void Bar()
{
}
}
public class Derived : Base
{
public void Bar(string x)
{
}
}
...
Derived d = new Derived();
d.Bar();
Це дійсно, оскільки Bar(string)
не приховує Bar()
, оскільки використовує компілятор C # hidebysig
. Якби вона використовувала семантику "приховувати за іменем", ви взагалі не змогли б зателефонувати Bar()
за посиланням типу Derived
, хоча ви все одно могли б передати її в Base і назвати так.
РЕДАГУВАТИ: Я щойно спробував це, скомпілювавши наведений вище код у DLL, ілдасміруючи його, видаливши hidebysig
для Bar()
і Bar(string)
, знову іламуючи його, потім спробувавши зателефонувати Bar()
з іншого коду:
Derived d = new Derived();
d.Bar();
Test.cs(6,9): error CS1501: No overload for method 'Bar' takes '0' arguments
Однак:
Base d = new Derived();
d.Bar();
(Немає проблем із компіляцією.)
Shadows
іOverloads
в VB.NET.