Larutan
Anda dapat menggunakan new Guid()sebagai gantinya
public void Problem(Guid optional = new Guid())
{
// when called without parameters this will be true
var guidIsEmpty = optional == Guid.Empty;
}
Anda juga bisa menggunakan default(Guid)
default(Guid)juga akan bekerja persis seperti new Guid().
Karena Guid adalah tipe nilai bukan tipe referensi, jadi, default(Guid)tidak sama dengan nullmisalnya, sebaliknya, itu sama dengan memanggil konstruktor default.
Yang berarti ini:
public void Problem(Guid optional = default(Guid))
{
// when called without parameters this will be true
var guidIsEmpty = optional == Guid.Empty;
}
Persis sama dengan contoh aslinya.
Penjelasan
Kenapa tidak Guid.Emptyberhasil?
Alasan Anda mendapatkan kesalahan adalah karena Emptydidefinisikan sebagai:
public static readonly Guid Empty;
Jadi, ini adalah variabel, bukan konstanta (didefinisikan sebagai static readonlybukan sebagai const). Compiler hanya dapat memiliki nilai-nilai yang diketahui-compiler sebagai parameter metode nilai-nilai default (tidak-hanya-runtime-dikenal).
Akar penyebab adalah bahwa Anda tidak dapat memiliki constapapunstruct satunya, tidak seperti enummisalnya. Jika Anda mencobanya, itu tidak akan dikompilasi.
Alasan sekali lagi adalah itu structbukan tipe primitif.
Untuk daftar semua tipe primitif di .NET lihat http://msdn.microsoft.com/en-gb/library/system.typecode.aspx
(catatan yang enumbiasanya mewarisiint , yang merupakan primitif)
Tapi new Guid() tidak konstan juga!
Saya tidak mengatakan itu perlu konstan. Perlu sesuatu yang dapat diputuskan dalam waktu kompilasi.Emptyis a field, jadi, nilainya tidak diketahui dalam waktu kompilasi (hanya pada awal waktu menjalankan).
Nilai parameter default harus diketahui pada waktu kompilasi, yang dapat berupa constnilai, atau sesuatu yang didefinisikan menggunakan fitur C # yang membuat nilai diketahui pada waktu kompilasi, seperti default(Guid)atau new Guid()(yang ditentukan pada waktu kompilasi untuk structs karena Anda tidak dapat memodifikasistruct konstruktor dalam kode).
Meskipun Anda dapat memberikan defaultatau newdengan mudah, Anda tidak dapat memberikan const(karena itu bukan tipe primitif atau enumseperti yang dijelaskan di atas). Jadi, sekali lagi, tidak mengatakan bahwa parameter opsional itu sendiri membutuhkan nilai konstanta, tetapi diketahui kompiler.