เมื่ออ่านคำถามนี้ทาง HNQ ฉันได้อ่านเกี่ยวกับประเภทข้อมูลอ้างอิงที่น่าเบื่อใน C # 8และทำการทดลองบางอย่าง
ฉันรู้ว่า 9 ครั้งใน 10 ครั้งหรือบ่อยกว่านั้นเมื่อมีคนพูดว่า "ฉันพบข้อผิดพลาดในการคอมไพเลอร์!" นี่คือการออกแบบและความเข้าใจผิดของพวกเขาเอง และตั้งแต่ฉันเริ่มมองหาคุณลักษณะนี้เฉพาะในวันนี้อย่างชัดเจนฉันไม่เข้าใจมันมากนัก ด้วยวิธีนี้ให้ดูที่รหัสนี้:
#nullable enable
class Program
{
static void Main()
{
var s = "";
var b = s == null; // If you comment this line out, the warning on the line below disappears
var i = s.Length; // warning CS8602: Dereference of a possibly null reference
}
}
หลังจากอ่านเอกสารที่ฉันเชื่อมโยงไปด้านบนฉันคาดว่าs == null
บรรทัดที่จะเตือนฉัน - หลังจากทั้งหมดs
เห็นได้ชัดว่าไม่เป็นโมฆะดังนั้นการเปรียบเทียบมันnull
จึงไม่สมเหตุสมผล
แต่ฉันได้รับคำเตือนในบรรทัดถัดไปและคำเตือนบอกว่าs
เป็นไปได้ที่จะมีการอ้างอิงที่เป็นโมฆะแม้ว่าสำหรับมนุษย์แล้วจะเห็นได้ชัดว่าไม่ใช่
มากกว่าคำเตือนจะไม่ปรากฏขึ้นถ้าเราไม่ได้เปรียบเทียบไปs
null
ฉันทำ Googling แล้วและฉันพบปัญหา GitHubซึ่งกลายเป็นเรื่องอื่นทั้งหมด แต่ในกระบวนการฉันได้สนทนากับผู้มีส่วนร่วมที่ให้ข้อมูลเชิงลึกมากขึ้นเกี่ยวกับพฤติกรรมนี้ (เช่น"การตรวจสอบ Null มักเป็นวิธีที่มีประโยชน์ การบอกคอมไพเลอร์ให้รีเซ็ตการอนุมานก่อนหน้าเกี่ยวกับความไม่แน่นอนของตัวแปร " ) ยังคงทิ้งฉันกับคำถามหลักที่ยังไม่ได้ตอบอย่างไรก็ตาม
แทนที่จะสร้างปัญหา GitHub ใหม่และอาจสละเวลาของผู้มีส่วนร่วมในโครงการที่ยุ่งอย่างไม่น่าเชื่อฉันกำลังนำเรื่องนี้ไปสู่ชุมชน
คุณช่วยอธิบายฉันหน่อยได้ไหมว่าเกิดอะไรขึ้นและเพราะอะไร โดยเฉพาะอย่างยิ่งเหตุใดจึงไม่มีการสร้างคำเตือนบนs == null
บรรทัดและทำไมเรามี CS8602
เมื่อมันไม่ดูเหมือนการnull
อ้างอิงเป็นไปได้ที่นี่ หากการอนุมานค่าความไม่เป็นโมฆะไม่ใช่การพิสูจน์หัวข้อย่อยเนื่องจากเธรด GitHub ที่เชื่อมโยงแสดงให้เห็นว่ามันจะผิดพลาดได้อย่างไร? อะไรคือตัวอย่างของสิ่งนั้น
?
เพราะs
ไม่เป็นโมฆะ มันไม่ได้กลายเป็น nullable null
เพียงเพราะเราก็พอโง่ที่จะเปรียบเทียบกับ