Lösung
Sie können new Guid()stattdessen verwenden
public void Problem(Guid optional = new Guid())
{
// when called without parameters this will be true
var guidIsEmpty = optional == Guid.Empty;
}
Sie können auch verwenden default(Guid)
default(Guid)wird auch genau so funktionieren new Guid().
Da Guid ein Werttyp ist, der kein Referenztyp default(Guid)ist, entspricht er nullbeispielsweise nicht dem Aufruf des Standardkonstruktors.
Was bedeutet, dass dies:
public void Problem(Guid optional = default(Guid))
{
// when called without parameters this will be true
var guidIsEmpty = optional == Guid.Empty;
}
Es ist genau das gleiche wie im Originalbeispiel.
Erläuterung
Warum hat es nicht Guid.Emptyfunktioniert?
Der Grund, warum Sie den Fehler erhalten, ist Emptyfolgender:
public static readonly Guid Empty;
Es ist also eine Variable, keine Konstante (definiert als static readonlynicht als const). Der Compiler kann nur vom Compiler bekannte Werte als Standardwerte für Methodenparameter haben (nicht nur zur Laufzeit bekannt).
Die Hauptursache ist, dass Sie keine haben constkönnen struct, anders als enumzum Beispiel. Wenn Sie es versuchen, wird es nicht kompiliert.
Der Grund ist noch einmal, dass structes sich nicht um einen primitiven Typ handelt.
Eine Liste aller primitiven Typen in .NET finden Sie unter http://msdn.microsoft.com/en-gb/library/system.typecode.aspx
(beachten Sie, dass enumnormalerweise geerbt wird int, was ein primitiver Typ ist).
Ist new Guid()aber auch keine Konstante!
Ich sage nicht, dass es eine Konstante braucht. Es braucht etwas, das in der Kompilierungszeit entschieden werden kann. Emptyist ein Feld, daher ist sein Wert in der Kompilierungszeit nicht bekannt (nur zu Beginn der Laufzeit).
Der Standardparameterwert muss zur Kompilierungszeit bekannt sein. Dies kann ein constWert sein oder etwas, das mit einer C # -Funktion definiert wurde, die den Wert zur Kompilierungszeit bekannt macht, wie default(Guid)oder new Guid()(der zur Kompilierungszeit für structs festgelegt wird, da Sie den structKonstruktor in nicht ändern können Code).
Während Sie bereitstellen können defaultoder neweinfach, können Sie kein a bereitstellen const(da es sich nicht um einen primitiven Typ oder einen enumwie oben erläuterten handelt). Wenn Sie also nicht sagen, dass der optionale Parameter selbst einen konstanten, aber vom Compiler bekannten Wert benötigt.