สารละลาย
คุณสามารถใช้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()
(ซึ่งจะตัดสินใจในเวลารวบรวมสำหรับstruct
s ในขณะที่คุณไม่สามารถแก้ไขตัวstruct
สร้างใน รหัส).
ในขณะที่คุณสามารถให้default
หรือnew
ง่ายคุณไม่สามารถให้const
(เพราะไม่ใช่ประเภทดั้งเดิมหรือenum
ตามที่อธิบายไว้ข้างต้น) ดังนั้นอีกครั้งไม่ได้บอกว่าตัวเลือกพารามิเตอร์ตัวเองต้องการค่าคงที่ แต่รวบรวมค่าที่รู้จักกัน