2010-08-06 35 views
12

sto iniziando a sfruttare parametri opzionali in .Net 4.0Utilizzando un parametro opzionale di tipo System.Drawing.Color

Il problema che sto avendo è quando provo a dichiarare un parametro opzionale di System.Drawing. Colore:

public myObject(int foo, string bar, Color rgb = Color.Transparent) 
{ 
    // .... 
} 

Desidero Color.Transparent essere il valore predefinito per il parametro rgb. Il problema è, continuo a ricevere questo errore di compilazione:

Default parameter value for 'rgb' must be a compile-time constant

uccide veramente il mio piano se posso usare solo i tipi primitivi per params opzionali.

+0

possibile duplicato di [C# 4.0: Posso utilizzare un TimeSpan come parametro facoltativo con un valore predefinito?] (Http://stackoverflow.com/questions/2168798/c-sharp-4- 0-can-i-use-a-timespan-as-an-optional-parametro-con-un-valore-predefinito) – nawfal

risposta

20

tipi di valore Nullable possono essere utilizzati per aiutare in situazioni come questa.

public class MyObject 
{ 
    public Color Rgb { get; private set; } 

    public MyObject(int foo, string bar, Color? rgb = null) 
    { 
     this.Rgb = rgb ?? Color.Transparent; 
     // .... 
    } 
} 

proposito, la ragione per cui questo è richiesto perché il valore predefinito viene compilato al punto chiamata durante compilazione e static readonly valori non sono impostati fino runtime. (Con l'inizializzatore del tipo)

+0

L'ho fatto senza Visual Studio, quindi potrebbe essere necessario apportare alcune modifiche minori. –

+0

Non funziona, il colore non è annullabile. –

+0

@Neil N, il punto interrogativo dopo il nome del tipo 'Colore' rende quella struttura a' Nullable '. –

3

Non sono un grande fan dei parametri opzionali per casi come questo. IMO il caso d'uso migliore per i parametri facoltativi è l'interoperabilità con COM, dove i parametri facoltativi sono usati piuttosto un po '. Situazioni come queste sono uno dei motivi per cui (suppongo) che i parametri opzionali non siano entrati nella lingua fino alla 4.0.

Invece di creare un parametro facoltativo, sovraccaricare la funzione in questo modo:

public myObject(int foo, string bar) : this (foo, bar, Color.Transparent) {}; 

public myObject(int foo, string bar, Color RGB) { 
... 
} 
+0

che è in realtà quello che avevo prima, ma nel mio caso, perché ci sono così tanti sovraccarichi del costruttore , ha più senso avere una mancia di parametri opzionali e mantenere un costruttore. –

+0

Direi che non è così, e un buon controesempio è il problema che stai incontrando in questo momento. Ci sono un certo numero di funzioni attorno alle librerie .NET standard che hanno * abbastanza * un numero di sovraccarichi. Prendi Convert.ToInt32() ad esempio ... Definire sovraccarichi multipli ti dà anche la possibilità di documentare il loro utilizzo separatamente. Spesso certe combinazioni di parametri opzionali hanno senso mentre altre no. I parametri opzionali non ti danno la possibilità di trasmettere ciò usando solo la firma della funzione stessa, mentre un sovraccarico (in qualche misura) lo fa. –

+0

A parte il parametro Color, che potrei sostituire con un parametro int, i parametri facoltativi mi hanno permesso di rimuovere circa 100 righe di codice ridondante. C'è molto meno da mantenere ora. –

Problemi correlati