C# Language
Överbelastningsupplösning
Sök…
Anmärkningar
Processen för överbelastningsupplösning beskrivs i C # -specifikationen , avsnitt 7.5.3. Avsnitt 7.5.2 (typinferens) och 7.6.5 (invokationsuttryck) är också relevanta.
Hur fungerar överbelastningsupplösningen förmodligen kommer att ändras i C # 7. Designanteckningarna indikerar att Microsoft kommer att lansera ett nytt system för att bestämma vilken metod som är bättre (i komplicerade scenarier).
Grundläggande överbelastningsexempel
Den här koden innehåller en överbelastad metod med namnet Hello :
class Example
{
public static void Hello(int arg)
{
Console.WriteLine("int");
}
public static void Hello(double arg)
{
Console.WriteLine("double");
}
public static void Main(string[] args)
{
Hello(0);
Hello(0.0);
}
}
När huvudmetoden kallas kommer den att skrivas ut
int
double
Vid kompileringstiden, när kompilatorn hittar metodsamtalet Hello(0)
, hittar den alla metoder med namnet Hello
. I det här fallet hittar den två av dem. Därefter försöker man bestämma vilken av metoderna som är bättre . Algoritmen för att bestämma vilken metod som är bättre är komplex, men den brukar koka ner för att "göra så få implicita omvandlingar som möjligt".
I fallet med Hello(0)
behövs således ingen konvertering för metoden Hello(int)
men en implicit numerisk konvertering behövs för metoden Hello(double)
. Således väljs den första metoden av kompilatorn.
När det gäller Hello(0.0)
finns det inget sätt att konvertera 0.0
till ett int
implicit, så metoden Hello(int)
övervägs inte ens för överbelastningsupplösning. Endast metoden återstår och så väljs den av kompilatorn.
"params" utvidgas inte om det inte är nödvändigt.
Följande program:
class Program
{
static void Method(params Object[] objects)
{
System.Console.WriteLine(objects.Length);
}
static void Method(Object a, Object b)
{
System.Console.WriteLine("two");
}
static void Main(string[] args)
{
object[] objectArray = new object[5];
Method(objectArray);
Method(objectArray, objectArray);
Method(objectArray, objectArray, objectArray);
}
}
kommer att skriva ut:
5
two
3
Method(objectArray)
kan tolkas på två sätt: ett enda Object
som råkar vara en matris (så programmet skulle mata ut 1
eftersom det skulle vara antalet argument, eller som ett array av argument, anges i normal form, som om metoden Method
inte hade nyckelordet params
. I dessa situationer har den normala, icke-utvidgade formen alltid företräde. Så programmets utgångar 5
.
I det andra uttrycket, Method(objectArray, objectArray)
, är både den utvidgade formen av den första metoden tillämplig. I detta fall har icke-utvidgade former företräde, så programmet skriver ut two
.
I det tredje uttrycket, Method(objectArray, objectArray, objectArray)
, är det enda alternativet att använda den utvidgade formen för den första metoden, så programmet skriver ut 3
.
Skickar noll som ett av argumenten
Om du har
void F1(MyType1 x) {
// do something
}
void F1(MyType2 x) {
// do something else
}
och av någon anledning måste du ringa den första överbelastningen av F1
men med x = null
och sedan göra det enkelt
F1(null);
kommer inte att kompilera eftersom samtalet är tvetydigt. För att motverka detta kan du göra
F1(null as MyType1);