Soluzione
Puoi usare new Guid()
invece
public void Problem(Guid optional = new Guid())
{
// when called without parameters this will be true
var guidIsEmpty = optional == Guid.Empty;
}
Puoi anche usare default(Guid)
default(Guid)
funzionerà anche esattamente come new Guid()
.
Poiché Guid è un tipo di valore non di tipo di riferimento, quindi default(Guid)
non è uguale, ad null
esempio, è uguale a chiamare il costruttore predefinito.
Ciò significa che questo:
public void Problem(Guid optional = default(Guid))
{
// when called without parameters this will be true
var guidIsEmpty = optional == Guid.Empty;
}
È esattamente lo stesso dell'esempio originale.
Spiegazione
Perché non ha Guid.Empty
funzionato?
Il motivo per cui ricevi l'errore è perché Empty
è definito come:
public static readonly Guid Empty;
Quindi, è una variabile, non una costante (definita come static readonly
non come const
). Il compilatore può avere solo valori noti del compilatore come valori predefiniti dei parametri del metodo (non noti solo in fase di esecuzione).
La causa principale è che non puoi avere const
alcuno struct
, a differenza enum
ad esempio. Se lo provi, non verrà compilato.
Ancora una volta la ragione è che struct
non è un tipo primitivo.
Per un elenco di tutti i tipi primitivi in .NET, vedere http://msdn.microsoft.com/en-gb/library/system.typecode.aspx
(notare che di enum
solito eredita int
, che è una primitiva)
Ma new Guid()
non è anche una costante!
Non sto dicendo che ha bisogno di una costante. Ha bisogno di qualcosa che possa essere deciso in fase di compilazione. Empty
è un campo, quindi il suo valore non è noto in fase di compilazione (solo all'inizio del tempo di esecuzione).
Il valore del parametro predefinito deve essere noto al momento della compilazione, che può essere un const
valore o qualcosa definito utilizzando una funzione C # che rende noto il valore al momento della compilazione, come default(Guid)
o new Guid()
(che viene deciso al momento della compilazione per struct
s poiché non è possibile modificare il struct
costruttore in codice).
Mentre puoi fornire default
o new
facilmente, non puoi fornire un const
(perché non è un tipo primitivo o un enum
come spiegato sopra). Quindi, ancora una volta, non dicendo che il parametro opzionale stesso necessita di un valore noto costante, ma del compilatore.