2013-06-14 13 views
5

Questo sembra qualcosa a cui avrei dovuto pensare prima, ma non è così. Sembra anche che ci dovrebbe essere un modo esistente per farlo.Come distinguere tra sovraccarichi quando un argomento è nullo

Il problema: Dire che ho una classe con un paio di costruttori

public class ModuleAction 
{ 
    public ModuleAction(string url, string caption) 
    { ... } 

    public ModuleAction(string url, ModuleAction action) 
    { ... } 
} 

E poi altrove, faccio una chiamata a uno di quei costruttori, ma il secondo argomento è NULL, non sa che costruttore da utilizzare

Esiste un modo per farlo? La mia soluzione attuale è quella di aggiungere un argomento non utilizzato a uno dei costruttori, ma ciò non sembra giusto.

La mia soluzione: (non abbastanza)

public class ModuleAction 
{ 
    public ModuleAction(string url, string caption, bool unused) 
    { ... } 

    public ModuleAction(string url, ModuleAction action) 
    { ... } 
} 
+2

Se si passa null, non dovrebbe importare quale costruttore viene chiamato, perché si sta solo passando l'URL. – NoPyGod

+2

È possibile eseguire il cast del tipo appropriato. –

+1

bene, vorrei semplicemente usare una stringa vuota invece di null – Najzero

risposta

12

Ci sono diverse opzioni qui.

La soluzione semplice e diretto è quello di lanciare il null a loro tipo dell'argomento in sovraccarico che si desidera utilizzare:

ModuleAction action = new ModuleAction("http://google.co.uk", (string)null); 

Una soluzione migliore sarebbe quella di utilizzare un nuovo costruttore che ha un solo parametro e per concatenarlo, utilizzando i valori predefiniti:

public ModuleAction(string url) : this(url, "") 
+0

+1 per il concatenamento – DonBoitnott

+0

Questa risposta è l'essenza dei primi tre commenti;) –

+2

@TimSchmelter - La cosa buona è precedente a due di questi;) – Oded

4

È possibile utilizzare casting per questo:

new ModuleAction("http://google.co.uk", (ModuleAction)null); 
6

Si può lanciare null per tipo di parametro previsto.

new ModuleAction(url, (string) null); 

new ModuleAction(url, (ModuleAction) null); 
2

Creare un costruttore che non avrà il secondo argomento.

public ModuleAction(string url) 
{ ... } 

Quindi è chiaro quale verrà utilizzato se non è possibile fornire il secondo argomento.

3

Sono disponibili tre opzioni:

  1. si può lanciare il nulla di essere il tipo appropriato.
  2. È possibile fornire un costruttore che accetta un solo argomento e lo utilizza anziché passare null.
  3. È possibile utilizzare i parametri denominati.
2

Come su

new ModuleAction("uu", (string)null); 
new ModuleAction("uu", (ModuleAction)null); 

?

Problemi correlati