Aus ECMA 335 , Abschnitt 8.10.4 von Partition 1:
Das CTS bietet eine unabhängige Steuerung sowohl der Namen, die von einem Basistyp aus sichtbar sind (Ausblenden), als auch der Freigabe von Layout-Slots in der abgeleiteten Klasse (Überschreiben). Das Ausblenden wird gesteuert, indem ein Mitglied in der abgeleiteten Klasse entweder als nach Namen oder nach Name und Unterschrift ausgeblendet markiert wird. Das Ausblenden wird immer basierend auf der Art des Elements durchgeführt, dh abgeleitete Feldnamen können Basisfeldnamen ausblenden, jedoch keine Methodennamen, Eigenschaftsnamen oder Ereignisnamen. Wenn ein abgeleitetes Mitglied als nach Namen ausgeblendet markiert ist, sind Mitglieder derselben Art in der Basisklasse mit demselben Namen in der abgeleiteten Klasse nicht sichtbar. Wenn das Mitglied durch Name und Signatur als ausgeblendet markiert ist, wird nur ein Mitglied derselben Art mit genau demselben Namen und Typ (für Felder) oder Methodensignatur (für Methoden) vor der abgeleiteten Klasse ausgeblendet. Die Umsetzung der Unterscheidung zwischen diesen beiden Formen des Versteckens wird vollständig von den Compilern der Ausgangssprache und der Reflexionsbibliothek bereitgestellt. Es hat keine direkten Auswirkungen auf das VES selbst.
(Das ist nicht sofort klar, hidebysig
bedeutet aber "durch Name und Unterschrift verstecken".)
Auch in Abschnitt 15.4.2.2 von Partition 2:
hidebysig wird für die Verwendung von Werkzeugen geliefert und vom VES ignoriert. Es gibt an, dass die deklarierte Methode alle Methoden der Basisklassentypen verbirgt, die eine übereinstimmende Methodensignatur haben. Wenn nicht angegeben, sollte die Methode alle gleichnamigen Methoden unabhängig von der Signatur ausblenden.
Angenommen, Sie haben als Beispiel:
public class Base
{
public void Bar()
{
}
}
public class Derived : Base
{
public void Bar(string x)
{
}
}
...
Derived d = new Derived();
d.Bar();
Das ist gültig, weil Bar(string)
es sich nicht versteckt Bar()
, weil der C # -Compiler verwendet hidebysig
. Wenn die Semantik "Nach Namen verstecken" verwendet würde , könnten Sie Bar()
eine Referenz des Typs überhaupt nicht aufrufen Derived
, obwohl Sie sie dennoch in Base umwandeln und so aufrufen könnten.
EDIT: Ich habe das gerade versucht , durch den obigen Code auf eine DLL kompilieren, ildasming es, das Entfernen hidebysig
für Bar()
und Bar(string)
, ilasming es wieder, dann versuchen rufen Bar()
von anderem Code:
Derived d = new Derived();
d.Bar();
Test.cs(6,9): error CS1501: No overload for method 'Bar' takes '0' arguments
Jedoch:
Base d = new Derived();
d.Bar();
(Keine Kompilierungsprobleme.)
Shadows
undOverloads
in VB.NET.