เมื่อฉันเปรียบเทียบค่าแบบสั้นที่เป็นโมฆะ คอมไพลเลอร์จะแปลงค่าเหล่านี้เป็นจำนวนเต็มก่อนเพื่อทำการเปรียบเทียบกับค่าว่าง ตัวอย่างเช่น ลองพิจารณาโค้ดง่ายๆ นี้:
short? cTestA;
if (cTestA == null) { ... }
มันถูกแปลงโดยคอมไพเลอร์เป็น:
short? CS$0$0001 = cTestA;
int? CS$0$0002 = CS$0$0001.HasValue ? new int?(CS$0$0001.GetValueOrDefault()) : null;
if (!CS$0$0002.HasValue){ ... }
สิ่งนี้จะเกิดขึ้นกับ .NET ทุกรุ่น รวมถึง .NET 4
ฉันพลาดอะไรไปที่นี่? อะไรคือสาเหตุของการแปลงสองครั้งนี้เพียงเพื่อการตรวจสอบ HasValue
ติดตาม
สิ่งที่ฉันคาดหวังให้คอมไพเลอร์ทำคือทำการตรวจสอบอย่างง่าย ๆ ด้วย .HasValue, if (cTestA.HasValue){}
อย่างน้อยนี่คือสิ่งที่ฉันทำในโค้ดของฉันหลังจากที่ฉันค้นพบการแปลงนี้
เหตุใดจึงมีการเพิ่มโค้ดพิเศษทั้งหมดนี้สำหรับการทดสอบง่ายๆ เช่นนี้