Çö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 readonlydeğ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 structolamamanızdır enum. Eğer denerseniz, derlenmeyecektir.
Nedeni bir kez daha structilkel bir tip olmaması.
.NET'teki tüm ilkel türlerin listesi için bkz. Http://msdn.microsoft.com/en-gb/library/system.typecode.aspx
( enumgenellikle intilkel 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. Emptybir 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 constdeğ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ı structdeğiştiremediğiniz için s derleme zamanında belirlenir struct) kodu).
Sağlayabilir defaultveya newkolayca sağlayabilirsiniz, ancak const(ilkel bir tür veya enumyukarı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.