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);


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow