มีคนพูดในหัวข้อสนทนานี้ว่าคุณไม่สามารถสร้างสตริงออกมาได้
(ซึ่งเป็นวลีที่ดีอย่างที่ฉันคิด) แต่ใช่คุณสามารถ :-) ได้ดังตัวอย่างต่อไปนี้:
var x = null + (string)null;
var wtf = x.ToString();
ทำงานได้ดีและไม่เกิดข้อยกเว้นเลย ข้อแตกต่างเพียงอย่างเดียวคือคุณต้องแคสต์ null หนึ่งในสตริง - หากคุณลบ(สตริง)การแคสต์ตัวอย่างจะยังคงคอมไพล์ แต่มีข้อยกเว้นรันไทม์: "Operator '+' มีความคลุมเครือในตัวดำเนินการของ พิมพ์ '<null>' และ '<null>' "
NBในตัวอย่างโค้ดด้านบนค่าของ x ไม่ได้เป็นค่าว่างอย่างที่คุณคาดหวังจริงๆแล้วมันเป็นสตริงว่างหลังจากที่คุณใส่ตัวถูกดำเนินการตัวใดตัวหนึ่งลงในสตริง
ข้อเท็จจริงที่น่าสนใจอีกประการหนึ่งก็คือใน C # / .NET วิธีnull
การปฏิบัติจะไม่เหมือนกันเสมอไปหากคุณพิจารณาประเภทข้อมูลที่แตกต่างกัน ตัวอย่างเช่น:
int? x = 1; // string x = "1";
x = x + null + null;
Console.WriteLine((x==null) ? "<null>" : x.ToString());
เกี่ยวกับบรรทัดที่ 1ของข้อมูลโค้ด: ถ้าx
เป็นตัวแปรจำนวนเต็มว่าง (เช่นint?
) ที่มีค่า1
คุณจะได้รับผลลัพธ์<null>
กลับมา ถ้ามันเป็นสตริง (ดังแสดงในความคิดเห็น) ที่มีค่า"1"
แล้วคุณจะได้รับกลับมามากกว่า"1"
<null>
หมายเหตุน่าสนใจเช่นกัน: หากคุณใช้var x = 1;
สำหรับบรรทัดแรกแสดงว่าคุณได้รับข้อผิดพลาดรันไทม์ ทำไม? เนื่องจากการกำหนดจะเปลี่ยนตัวแปรx
ให้เป็นประเภทข้อมูลint
ซึ่งไม่สามารถกำหนดค่าว่างได้ คอมไพเลอร์ไม่ได้ถือว่าint?
ที่นี่และด้วยเหตุนี้จึงล้มเหลวในบรรทัดที่ 2 เมื่อnull
มีการเพิ่ม
null.ToString()
wtf
ทำไมสิ่งนั้นทำให้คุณประหลาดใจ? คุณไม่สามารถเรียกเมธอดอินสแตนซ์ได้เมื่อคุณไม่มีอะไรจะเรียกมันตั้งแต่แรก