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 null
beispielsweise 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.Empty
funktioniert?
Der Grund, warum Sie den Fehler erhalten, ist Empty
folgender:
public static readonly Guid Empty;
Es ist also eine Variable, keine Konstante (definiert als static readonly
nicht 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 const
können struct
, anders als enum
zum Beispiel. Wenn Sie es versuchen, wird es nicht kompiliert.
Der Grund ist noch einmal, dass struct
es 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 enum
normalerweise 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. Empty
ist 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 const
Wert 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 struct
s festgelegt wird, da Sie den struct
Konstruktor in nicht ändern können Code).
Während Sie bereitstellen können default
oder new
einfach, können Sie kein a bereitstellen const
(da es sich nicht um einen primitiven Typ oder einen enum
wie oben erläuterten handelt). Wenn Sie also nicht sagen, dass der optionale Parameter selbst einen konstanten, aber vom Compiler bekannten Wert benötigt.