จาก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
เลยแม้ว่าคุณจะยังสามารถส่งไปยังฐานและเรียกแบบนั้นได้
แก้ไข: ฉันได้พยายามเพียงแค่นี้โดยการรวบรวมรหัสข้างต้นเพื่อ DLL ที่ ildasming มันลบhidebysig
สำหรับBar()
และBar(string)
, ilasming มันอีกครั้งแล้วพยายามที่จะเรียก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