Rozwiązanie
Możesz użyć new Guid()
zamiast tego
public void Problem(Guid optional = new Guid())
{
// when called without parameters this will be true
var guidIsEmpty = optional == Guid.Empty;
}
Możesz także użyć default(Guid)
default(Guid)
również będzie działać dokładnie tak, jak new Guid()
.
Ponieważ Guid jest typem wartości, a nie typem referencyjnym, więc default(Guid)
nie jest równy null
na przykład, zamiast tego jest równy wywołaniu domyślnego konstruktora.
Co oznacza, że:
public void Problem(Guid optional = default(Guid))
{
// when called without parameters this will be true
var guidIsEmpty = optional == Guid.Empty;
}
Jest dokładnie taki sam jak oryginalny przykład.
Wyjaśnienie
Dlaczego nie Guid.Empty
zadziałało?
Powód, dla którego otrzymujesz błąd, jest Empty
następujący:
public static readonly Guid Empty;
Jest to więc zmienna, a nie stała (zdefiniowana jako static readonly
nie jako const
). Kompilator może mieć tylko wartości znane kompilatorowi jako wartości domyślne parametrów metody (nie znane tylko w czasie wykonywania).
Główną przyczyną jest to, że nie możesz mieć const
żadnego struct
, w przeciwieństwie enum
do na przykład. Jeśli spróbujesz, nie skompiluje się.
Powód jest taki, że struct
nie jest to typ prymitywny.
Aby zapoznać się z listą wszystkich typów pierwotnych w .NET, zobacz http://msdn.microsoft.com/en-gb/library/system.typecode.aspx
(zauważ, że enum
zwykle dziedziczy int
, co jest prymitywem)
Ale new Guid()
nie jest też stałą!
Nie mówię, że to wymaga stałej. Potrzebuje czegoś, co można zdecydować w czasie kompilacji. Empty
jest polem, więc jego wartość nie jest znana w czasie kompilacji (tylko na samym początku działania).
Domyślna wartość parametru musi być znana w czasie kompilacji, która może być const
wartością lub czymś zdefiniowanym za pomocą funkcji C #, która sprawia, że wartość jest znana w czasie kompilacji, na przykład default(Guid)
lub new Guid()
(co jest ustalane w czasie kompilacji dla struct
s, ponieważ nie można modyfikować struct
konstruktora w kod).
Chociaż możesz podać default
lub new
łatwo, nie możesz podać const
(ponieważ nie jest to typ pierwotny ani, enum
jak wyjaśniono powyżej). Tak więc, ponownie, nie mówiąc, że opcjonalny parametr sam w sobie wymaga stałej, ale wartość znana kompilatorowi.