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 null
misalnya, 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.Empty
berhasil?
Alasan Anda mendapatkan kesalahan adalah karena Empty
didefinisikan sebagai:
public static readonly Guid Empty;
Jadi, ini adalah variabel, bukan konstanta (didefinisikan sebagai static readonly
bukan 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 const
apapunstruct
satunya, tidak seperti enum
misalnya. Jika Anda mencobanya, itu tidak akan dikompilasi.
Alasan sekali lagi adalah itu struct
bukan tipe primitif.
Untuk daftar semua tipe primitif di .NET lihat http://msdn.microsoft.com/en-gb/library/system.typecode.aspx
(catatan yang enum
biasanya mewarisiint
, yang merupakan primitif)
Tapi new Guid()
tidak konstan juga!
Saya tidak mengatakan itu perlu konstan. Perlu sesuatu yang dapat diputuskan dalam waktu kompilasi.Empty
is 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 const
nilai, 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 struct
s karena Anda tidak dapat memodifikasistruct
konstruktor dalam kode).
Meskipun Anda dapat memberikan default
atau new
dengan mudah, Anda tidak dapat memberikan const
(karena itu bukan tipe primitif atau enum
seperti yang dijelaskan di atas). Jadi, sekali lagi, tidak mengatakan bahwa parameter opsional itu sendiri membutuhkan nilai konstanta, tetapi diketahui kompiler.