ภายในswitch
คำสั่งการจับคู่รูปแบบโดยใช้ a case
สำหรับชนิดที่ชัดเจนจะถามว่าค่าที่เป็นปัญหาเป็นประเภทเฉพาะนั้นหรือเป็นประเภทที่ได้รับ มันเทียบเท่ากันแน่นอนของis
switch (someString) {
case string s:
}
if (someString is string)
ค่าnull
นี้ไม่มีประเภทดังนั้นจึงไม่เป็นไปตามเงื่อนไขข้างต้น ประเภทคงที่ของsomeString
ไม่เข้ามามีบทบาทในตัวอย่างใดตัวอย่างหนึ่ง
var
ชนิดแม้ว่าจะอยู่ในรูปแบบการจับคู่ทำหน้าที่เป็นป่าการ์ดและจะตรงกับค่าใด ๆ null
รวมทั้ง
default
กรณีที่นี่เป็นรหัสที่ตายแล้ว ค่าcase var o
นี้จะจับคู่ค่าว่างหรือไม่เป็นค่าว่าง กรณีที่ไม่ใช่ค่าเริ่มต้นจะชนะเหนือค่าเริ่มต้นเสมอดังนั้นdefault
จะไม่ถูกตี หากคุณดู IL คุณจะเห็นว่ามันไม่ได้เปล่งออกมาเลย
ในภาพรวมอาจดูแปลกที่สิ่งนี้รวบรวมโดยไม่มีการเตือนใด ๆ (ทำให้ฉันผิดหวังอย่างแน่นอน) แต่สิ่งนี้ตรงกับพฤติกรรม C # ที่ย้อนกลับไปที่ 1.0 คอมไพเลอร์อนุญาตdefault
กรณีแม้ว่าจะสามารถพิสูจน์ได้เล็กน้อยว่าจะไม่มีวันโดน พิจารณาเป็นตัวอย่างดังต่อไปนี้:
bool b = ...;
switch (b) {
case true: ...
case false: ...
default: ...
}
ที่นี่default
จะไม่ถูกตี (แม้ว่าจะbool
มีค่าที่ไม่ใช่ 1 หรือ 0) แต่ C # ได้อนุญาตสิ่งนี้ตั้งแต่ 1.0 โดยไม่มีการเตือน การจับคู่รูปแบบจะสอดคล้องกับลักษณะการทำงานนี้ที่นี่
o
เป็นstring
(ได้รับการยืนยันกับ generics - คือFoo(o)
ที่Foo<T>(T template) => typeof(T).Name
) - มันเป็นกรณีที่น่าสนใจมากที่string x
จะทำงานที่แตกต่างกว่าvar x
แม้ในขณะที่x
พิมพ์ (โดยคอมไพเลอร์) เป็นstring