Dipende da TypeA
e TypeB
.
- Se esattamente uno di loro è applicabile (ad esempio non v'è alcuna conversione da
null
a TypeB
perché è un tipo di valore ma TypeA
è un tipo di riferimento), la chiamata verrà effettuata a quella applicabile.
- In caso contrario, dipende dalla relazione tra
TypeA
e TypeB
.
- Se v'è una conversione implicita
TypeA
-TypeB
ma nessuna conversione implicita TypeB
-TypeA
allora verrà utilizzato il sovraccarico utilizzando TypeA
.
- Se è presente una conversione implicita da
TypeB
a TypeA
ma nessuna conversione implicita da TypeA
a TypeB
, verrà utilizzato il sovraccarico utilizzando TypeB
.
- In caso contrario, la chiamata è ambigua e non verrà compilata.
Vedere la sezione 7.4.3.4 delle specifiche C# 3.0 per le modalità.
Ecco un esempio di ciò che non è ambiguo. Qui TypeB
deriva da TypeA
, il che significa che c'è una conversione implicita da TypeB
a TypeA
, ma non viceversa. Così il sovraccarico utilizzando TypeB
viene utilizzato:
using System;
class TypeA {}
class TypeB : TypeA {}
class Program
{
static void Foo(TypeA x)
{
Console.WriteLine("Foo(TypeA)");
}
static void Foo(TypeB x)
{
Console.WriteLine("Foo(TypeB)");
}
static void Main()
{
Foo(null); // Prints Foo(TypeB)
}
}
In generale, anche a fronte di una chiamata altrimenti ambiguo, per garantire che un particolare sovraccarico viene utilizzato, appena lanciato:
Foo((TypeA) null);
o
Foo((TypeB) null);
Si noti che se ciò implica l'ereditarietà nelle classi di dichiarazione (ovvero una classe sta sovraccaricando un metodo dichiarato dalla sua classe base) si è in un altro problema, e si ed a lanciare l'obiettivo del metodo piuttosto che l'argomento.
fonte
2009-04-05 19:51:09
Un altro uno di essere a conoscenza di sovraccarico metodi in cui almeno un metodo utilizza la parola chiave params. –