C # 4.0 e una combinazione di parametri opzionali e sovraccarichi ti danno un avvertimento sull'ambiguità?

StackOverflow https://stackoverflow.com/questions/1211203

Domanda

Ho iniziato a leggere la versione di accesso anticipato di Jon Skeet del suo libro, che contiene sezioni su C # 4.0, e una cosa mi ha colpito. Purtroppo non ho Visual Studio 2010 disponibile, quindi ho pensato di fare una domanda qui e vedere se qualcuno conosceva la risposta.

Se ho il seguente codice, una combinazione di codice esistente e nuovo codice:

public void SomeMethod(Int32 x, Int32 y) { ... }

public void SomeMethod(Int32 x, Int32 y, Int32 z = 0) { ... }

Il compilatore si lamenterà nel sito di definizione o nel sito di chiamata per possibili ambiguità?

Ad esempio, cosa farà effettivamente questo pezzo di codice?

SomeClass sc = new SomeClass();
sc.SomeMethod(15, 23);

Compilerà? Chiamerà quello senza il parametro z, o chiamerà quello con il parametro z?

È stato utile?

Soluzione

Si compilerà senza avvisi e sceglierà il primo sovraccarico.

Con l'introduzione di parametri opzionali e denominati, il meccanismo di risoluzione del sovraccarico di C # è diventato davvero complicato. In questo caso specifico, ha comunque senso. Come al solito, il compilatore sceglierà il sovraccarico più specifico che corrisponde agli argomenti.

Non credo che questo caso specifico sia molto diverso da C # 1.0:

public void SomeMethod(Int32 x, Int32 y) { } 
public void SomeMethod(Int32 x, Int32 y, params Int32[] z) { }

che funziona in modo identico (in termini di risoluzione del sovraccarico).

Risposta di follow-up: non credo. Temo che dovrai specificare manualmente l'argomento predefinito nella chiamata del metodo. Tuttavia, se il parametro x o y aveva un nome diverso come:

public void SomeMethod(Int32 x, Int32 y) { } 
public void SomeMethod(Int32 t, Int32 y, Int32 z = 0) { }

puoi scegliere il secondo sovraccarico con:

obj.SomeMethod(t: 10, y: 20);

Altri suggerimenti

Questo è trattato nella "Risoluzione di sovraccarico" sezione del capitolo.

Quando il compilatore ha due opzioni altrimenti uguali tra cui scegliere, utilizzerà un sovraccarico che non ha bisogno di usare alcun parametro opzionale non fornito rispetto a uno che lo fa, ma è una scelta binaria rigorosa. Se deve scegliere tra un sovraccarico con un parametro opzionale non fornito e due, lo considererà una situazione ambigua.

Per rispondere al tuo commento di follow-up, non conosco alcun modo per forzare un sovraccarico con il parametro opzionale da utilizzare senza specificarlo. Non puoi usare nessuno di questi, ad esempio:

// Both invalid
sc.SomeMethod(15, 23, );
sc.SomeMethod(15, 23, z:)

Se, tuttavia, i tuoi metodi utilizzano nomi di parametri diversi, potresti farlo quindi:

public void SomeMethod(Int32 x, Int32 y) { ... }
public void SomeMethod(Int32 a, Int32 b, Int32 c = 0) { ... }

sc.SomeMethod(a: 15, b: 23); // Calls second method
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top