รหัสต่อไปนี้มีวิธีการแบบคงที่Foo()
เรียกวิธีการอินสแตนซ์Bar()
:
public sealed class Example
{
int count;
public static void Foo( dynamic x )
{
Bar(x);
}
void Bar( dynamic x )
{
count++;
}
}
คอมไพล์โดยไม่มีข้อผิดพลาด * แต่สร้างข้อยกเว้น runtime binder ที่รันไทม์ การลบพารามิเตอร์ไดนามิกออกเป็นวิธีการเหล่านี้ทำให้เกิดข้อผิดพลาดของคอมไพเลอร์ตามที่คาดไว้
เหตุใดการมีพารามิเตอร์แบบไดนามิกจึงอนุญาตให้คอมไพล์โค้ดได้? ReSharper ไม่แสดงว่าเป็นข้อผิดพลาดเช่นกัน
แก้ไข 1: * ใน Visual Studio 2008
แก้ไข 2:เพิ่มsealed
เนื่องจากเป็นไปได้ว่าคลาสย่อยอาจมีBar(...)
วิธีการแบบคงที่ แม้แต่เวอร์ชันที่ปิดผนึกก็ยังคอมไพล์เมื่อไม่สามารถเรียกวิธีการอื่นนอกเหนือจากวิธีอินสแตนซ์ที่รันไทม์ได้
dynamic
เว้นแต่ว่าคุณจำเป็นจริงๆ