สารละลาย
คุณสามารถใช้new Guid()แทน
public void Problem(Guid optional = new Guid())
{
// when called without parameters this will be true
var guidIsEmpty = optional == Guid.Empty;
}
คุณยังสามารถใช้ default(Guid)
default(Guid)new Guid()ยังจะทำงานตรงตามที่
เนื่องจาก Guid เป็นประเภทค่าไม่ใช่ชนิดอ้างอิงดังนั้นจึงdefault(Guid)ไม่เท่ากับnullตัวอย่างแทนมันเท่ากับการเรียก constructor เริ่มต้น
ซึ่งหมายความว่า:
public void Problem(Guid optional = default(Guid))
{
// when called without parameters this will be true
var guidIsEmpty = optional == Guid.Empty;
}
มันเหมือนกับตัวอย่างดั้งเดิม
คำอธิบาย
ทำไมไม่Guid.Emptyทำงาน
เหตุผลที่คุณได้รับข้อผิดพลาดคือเนื่องจากEmptyมีการกำหนดเป็น:
public static readonly Guid Empty;
ดังนั้นมันจึงเป็นตัวแปรไม่ใช่ค่าคงที่ (กำหนดเป็นstatic readonlyไม่เป็นconst) คอมไพเลอร์สามารถมีค่าที่ทราบได้เฉพาะคอมไพเลอร์เป็นค่าเริ่มต้นของพารามิเตอร์เมธอด (ไม่ใช่รู้จักเฉพาะรันไทม์)
สาเหตุคือการที่คุณไม่สามารถมีconstใด ๆstructซึ่งแตกต่างจากenumตัวอย่างเช่น หากคุณลองมันจะไม่รวบรวม
เหตุผลอีกครั้งstructคือไม่ได้เป็นประเภทดั้งเดิม
สำหรับรายการประเภทดั้งเดิมทั้งหมดใน. NET ดูhttp://msdn.microsoft.com/en-gb/library/system.typecode.aspx
(โปรดทราบว่าenumโดยปกติแล้วจะสืบทอดintซึ่งเป็นแบบดั้งเดิม)
แต่new Guid()ก็ไม่คงที่เช่นกัน!
ฉันไม่ได้บอกว่ามันต้องการค่าคงที่ มันต้องการสิ่งที่สามารถตัดสินใจได้ในเวลารวบรวม Emptyเป็นเขตข้อมูลดังนั้นจึงไม่ทราบค่าในเวลารวบรวม (ในช่วงเริ่มต้นเท่านั้น)
ค่าพารามิเตอร์เริ่มต้นจะต้องรู้จักกันในเวลารวบรวมซึ่งอาจเป็น constค่าหรือสิ่งที่กำหนดโดยใช้คุณสมบัติ C # ที่ทำให้ค่าที่รู้จักกันในเวลารวบรวมเช่นdefault(Guid)หรือnew Guid()(ซึ่งจะตัดสินใจในเวลารวบรวมสำหรับstructs ในขณะที่คุณไม่สามารถแก้ไขตัวstructสร้างใน รหัส).
ในขณะที่คุณสามารถให้defaultหรือnewง่ายคุณไม่สามารถให้const(เพราะไม่ใช่ประเภทดั้งเดิมหรือenumตามที่อธิบายไว้ข้างต้น) ดังนั้นอีกครั้งไม่ได้บอกว่าตัวเลือกพารามิเตอร์ตัวเองต้องการค่าคงที่ แต่รวบรวมค่าที่รู้จักกัน