2012-01-13 17 views
12

Supponiamo che io ho questi due ctors:La chiamata è ambigua tra le seguenti metodi o proprietà

public SomeClass(string a, Color? c = null, Font d = null) 
     { 
      // ... 
     } 

public SomeClass(string a, Font c = null, Color? d = null) 
     { 
      // ... 
     } 

~ e lo faccio questo:

SomeClass sc = new SomeClass("Lorem ipsum"); 

Prendo questo: "Errore 1 la chiamata è ambigua tra i seguenti metodi o proprietà [...] "

Mi sembra evidente che non importa a quale mi riferisco perché il risultato finale è lo stesso (almeno in questo caso particolare, e per me è tutto t cappello ora conta), quindi quali sono le mie opzioni per aggirare questo?

MODIFICA 1: @oltman: esempio semplificato.

voglio solo essere in grado di scrivere

[...] new SomeClass("Lorem", Color.Green) 

invece di

[...] new SomeClass("Lorem", null, Color.Green) 
+3

C'è una ragione si dispone sia, o è solo un esempio semplificato? – oltman

risposta

21

Entrambi i costruttori prendono lo stesso numero di argomenti, ma in un ordine diverso. Poiché sono stati specificati valori predefiniti per i due parametri del costruttore, il compilatore non può distinguere tra i due overload quando il secondo argomento non viene fornito.

vi consiglio di rimuovere i costruttori esistenti e sostituire con il seguente:

public SomeClass(string a, Color? color, Font font) 
{ 
    // constructor implementation 
} 

public SomeClass(string a) : this(a, null, null) {} 
public SomeClass(string a, Color color) : this(a, color, null) {} 
public SomeClass(string a, Font font) : this(a, null, font) {} 
+0

Questo funziona fa miracoli ed è proprio quello che stavo cercando. –

7

Un modo per costringerlo a lavorare:

SomeClass sc = new SomeClass("Lorem ipsum", (Color?)null, (Font)null); 
+0

è molto utile quando si ha solo un argomento – Eli

1

Puoi creare un altro costruttore che richiede solo la stringa, e aggiornare i costruttori cui sopra per effettuare il loro secondo parametri obbligatoria?

Se l'idea è che si può costruire l'oggetto fornendo sempre la stringa e quindi fornendo opzionalmente colore e il carattere o entrambi, come su questo:

public SomeClass(string a) 
     { 
      // ... 
     } 

public SomeClass(string a, Color? c) 
     { 
      // ... 
     } 

public SomeClass(string a, Font f, Color? d = null) 
     { 
      // ... 
     } 
0

Prendo questo: "Errore 1 la chiamata è ambigua tra i seguenti metodi o proprietà [...]"

sembra evidente per me che non importa quale rimando come il risultato finale è lo stesso

La chiamata è ambigua. Ogni costruttore è unico: non importa se entrambi creano e restituiscono un'istanza, perché potrebbe esserci una logica diversa in ciascun costruttore. Il compilatore continua a non sapere quale costruttore intendi.

0

Questo è un perfetto esempio di anti-pattern, il modo migliore per evitare questo è la risposta di @Phil Klein.

Ecco un altro sintassi per il passaggio di classe come nullo:

SomeClass sc = new SomeClass("Lorem ipsum", null as Color, null as Font); 
Problemi correlati