Çözüm
Bunun new Guid()
yerine kullanabilirsiniz
public void Problem(Guid optional = new Guid())
{
// when called without parameters this will be true
var guidIsEmpty = optional == Guid.Empty;
}
Ayrıca kullanabilirsiniz default(Guid)
default(Guid)
ayrıca tam olarak çalışacaktır new Guid()
.
Guid, başvuru türü olmayan bir değer türü olduğundan, örneğin, default(Guid)
eşit değildir null
, bunun yerine varsayılan yapıcı çağrılmasına eşittir.
Bu şu anlama gelir:
public void Problem(Guid optional = default(Guid))
{
// when called without parameters this will be true
var guidIsEmpty = optional == Guid.Empty;
}
Orijinal örnekle tamamen aynı.
açıklama
Neden Guid.Empty
çalışmadı?
Hatayı almanızın nedeni Empty
şu şekilde tanımlanmasıdır:
public static readonly Guid Empty;
Yani, bu bir değişken değil, (olarak tanımlanan bir sabittir static readonly
değil const
). Derleyici, yöntem parametreleri varsayılan değerleri olarak yalnızca derleyici tarafından bilinen değerlere sahip olabilir (yalnızca çalışma zamanı için bilinmez).
Temel neden, örneğin aksine const
, hiçbirine sahip struct
olamamanızdır enum
. Eğer denerseniz, derlenmeyecektir.
Nedeni bir kez daha struct
ilkel bir tip olmaması.
.NET'teki tüm ilkel türlerin listesi için bkz. Http://msdn.microsoft.com/en-gb/library/system.typecode.aspx
( enum
genellikle int
ilkel olan devralmayı unutmayın )
Ama new Guid()
sabit de değil!
Sabit olması gerektiğini söylemiyorum. Derleme zamanında karar verilebilecek bir şeye ihtiyacı vardır. Empty
bir alandır, bu nedenle değeri derleme zamanında bilinmez (yalnızca çalışma süresinin en başında).
Varsayılan parametre değeri derleme zamanında bilinmelidir, bu bir const
değer olabilir veya derleme zamanında değeri bilinen bir C # özelliği kullanılarak tanımlanmış bir şey ( default(Guid)
veya new Guid()
yapıcıyı struct
değiştiremediğiniz için s derleme zamanında belirlenir struct
) kodu).
Sağlayabilir default
veya new
kolayca sağlayabilirsiniz, ancak const
(ilkel bir tür veya enum
yukarıda açıklandığı gibi değil) sağlayamazsınız . Yani, yine, isteğe bağlı parametrenin kendisinin sabit, ancak derleyici bilinen bir değere ihtiyacı olduğunu söylemez.