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 nullna 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.Emptyzadziałało?
Powód, dla którego otrzymujesz błąd, jest Emptynastępujący:
public static readonly Guid Empty;
Jest to więc zmienna, a nie stała (zdefiniowana jako static readonlynie 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 enumdo na przykład. Jeśli spróbujesz, nie skompiluje się.
Powód jest taki, że structnie 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 enumzwykle 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. Emptyjest 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ć constwartoś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 structs, ponieważ nie można modyfikować structkonstruktora w kod).
Chociaż możesz podać defaultlub newłatwo, nie możesz podać const(ponieważ nie jest to typ pierwotny ani, enumjak 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.