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 nullesempio, è 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.Emptyfunzionato?
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 readonlynon 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 constalcuno struct, a differenza enumad esempio. Se lo provi, non verrà compilato.
Ancora una volta la ragione è che structnon è 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 enumsolito 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 constvalore 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 structs poiché non è possibile modificare il structcostruttore in codice).
Mentre puoi fornire defaulto newfacilmente, non puoi fornire un const(perché non è un tipo primitivo o un enumcome spiegato sopra). Quindi, ancora una volta, non dicendo che il parametro opzionale stesso necessita di un valore noto costante, ma del compilatore.