De ECMA 335 , seção 8.10.4 da partição 1:
O CTS fornece controle independente sobre os nomes que são visíveis a partir de um tipo base (ocultação) e o compartilhamento de slots de layout na classe derivada (substituição). O ocultamento é controlado marcando um membro na classe derivada como ocultar pelo nome ou ocultar pelo nome e assinatura. A ocultação é sempre realizada com base no tipo de membro, ou seja, nomes de campos derivados podem ocultar nomes de campos básicos, mas não nomes de métodos, nomes de propriedades ou nomes de eventos. Se um membro derivado for marcado como ocultar pelo nome, os membros do mesmo tipo na classe base com o mesmo nome não serão visíveis na classe derivada; se o membro estiver marcado como oculto por nome e assinatura, então apenas um membro do mesmo tipo com exatamente o mesmo nome e tipo (para campos) ou assinatura de método (para métodos) será oculto da classe derivada. A implementação da distinção entre essas duas formas de ocultação é fornecida inteiramente pelos compiladores da linguagem fonte e pela biblioteca de reflexão; não tem impacto direto no próprio VES.
(Não fica claro disso, mas hidebysig
significa "ocultar pelo nome e assinatura".)
Também na seção 15.4.2.2 da partição 2:
hidebysig é fornecido para o uso de ferramentas e é ignorado pelo VES. Ele especifica que o método declarado oculta todos os métodos dos tipos de classe base que possuem uma assinatura de método correspondente; quando omitido, o método deve ocultar todos os métodos com o mesmo nome, independentemente da assinatura.
Por exemplo, suponha que você tenha:
public class Base
{
public void Bar()
{
}
}
public class Derived : Base
{
public void Bar(string x)
{
}
}
...
Derived d = new Derived();
d.Bar();
Isso é válido, porque Bar(string)
não esconde Bar()
, porque o compilador C # usa hidebysig
. Se ele usasse a semântica "ocultar pelo nome", você não seria capaz de chamar Bar()
uma referência do tipo Derived
, embora ainda pudesse lançá-la no Base e chamá-la dessa forma.
EDIT: Acabei de tentar compilar o código acima para uma DLL, ildasming-lo, removendo hidebysig
for Bar()
e Bar(string)
, ilasming-lo novamente e, em seguida, tentar chamar Bar()
de outro código:
Derived d = new Derived();
d.Bar();
Test.cs(6,9): error CS1501: No overload for method 'Bar' takes '0' arguments
Contudo:
Base d = new Derived();
d.Bar();
(Sem problemas de compilação.)
Shadows
eOverloads
no VB.NET.