Metodöverlagring
Metodöverlagring i C# möjliggör definition av flera metoder med samma namn i en klass, där varje metod skiljer sig åt i sina parametertyper, antal parametrar eller båda, vilket ger ett mer strukturerat och flexibelt sätt att hantera olika indatafall.
Till exempel kan du ha två metoder med samma namn men olika antal parametrar:
index.cs
12345678910111213141516171819using System; class ConsoleApp { static int sum(int a, int b) { return a + b; } static int sum(int a, int b, int c) { return a + b + c; } static void Main() { Console.WriteLine(sum(5, 7)); Console.WriteLine(sum(5, 7, 9)); } }
I koden ovan överlagrades metoden sum
för att ha två varianter av parametrar. En metod kan även ha olika returtyper för sina olika varianter, men det är viktigt att det inte uppstår någon tvetydighet, annars kommer kompilatorn att visa ett fel eftersom det primära sättet för en kompilator att särskilja mellan två metoder med samma namn är deras parameterlista.
Till exempel:
index.cs
12345678910static int sum(int a, int b) { return a + b; } // This is wrong and will show an error static long sum(int a, int b) { return a + b; }
Koden ovan är felaktig eftersom parametrarna är exakt desamma som i den ursprungliga metoden medan returtypen är annorlunda. Detta är inte tillåtet eftersom det gör det omöjligt för kompilatorn (eller ens för människor) att avgöra vilken som ska köras när metoden anropas:
index.cs
123sum(1, 3); // Should it execute `int sum(int a, int b)` or `long sum(int a, int b)` ? // It is impossible to reach a good answer for the compiler in this case so it shows an error
Det är därför, vid överlagring av en metod, att en metod med en annan returtyp också bör ha en annan uppsättning parametrar för att göra den särskiljbar och undvika tvetydighet. Följande är också fel:
index.cs
12345678910static int sum(int a, int b) { return a + b; } // This is wrong and will show an error static long sum(int first, int second) { return first + second; }
Detta beror på att parametrarnas namn inte spelar någon roll, men deras typer gör det. Följande överlagringsfall är giltiga:
index.cs
1234567891011121314151617181920212223242526using System; class ConsoleApp { static int sum(int a, int b) { return a + b; } static long sum(long a, long b) { return a + b; } static string sum(int a, long b, float c) { return Convert.ToString(a + b + c); } static void Main() { Console.WriteLine(sum(5, 7)); // Calls 'int sum()' Console.WriteLine(sum(500000000000, 700000000000)); // Calls 'long sum()' Console.WriteLine(sum(5, 7, 9)); // Calls 'string sum()' } }
1. Hur särskiljer kompilatorn mellan överlagrade metoder?
2. Vilket av följande är ett giltigt exempel på metodöverlagring?
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal
Can you give more examples of valid method overloading in C#?
What are some common mistakes to avoid when overloading methods?
Can you explain how method overloading differs from method overriding?
Awesome!
Completion rate improved to 2.04
Metodöverlagring
Svep för att visa menyn
Metodöverlagring i C# möjliggör definition av flera metoder med samma namn i en klass, där varje metod skiljer sig åt i sina parametertyper, antal parametrar eller båda, vilket ger ett mer strukturerat och flexibelt sätt att hantera olika indatafall.
Till exempel kan du ha två metoder med samma namn men olika antal parametrar:
index.cs
12345678910111213141516171819using System; class ConsoleApp { static int sum(int a, int b) { return a + b; } static int sum(int a, int b, int c) { return a + b + c; } static void Main() { Console.WriteLine(sum(5, 7)); Console.WriteLine(sum(5, 7, 9)); } }
I koden ovan överlagrades metoden sum
för att ha två varianter av parametrar. En metod kan även ha olika returtyper för sina olika varianter, men det är viktigt att det inte uppstår någon tvetydighet, annars kommer kompilatorn att visa ett fel eftersom det primära sättet för en kompilator att särskilja mellan två metoder med samma namn är deras parameterlista.
Till exempel:
index.cs
12345678910static int sum(int a, int b) { return a + b; } // This is wrong and will show an error static long sum(int a, int b) { return a + b; }
Koden ovan är felaktig eftersom parametrarna är exakt desamma som i den ursprungliga metoden medan returtypen är annorlunda. Detta är inte tillåtet eftersom det gör det omöjligt för kompilatorn (eller ens för människor) att avgöra vilken som ska köras när metoden anropas:
index.cs
123sum(1, 3); // Should it execute `int sum(int a, int b)` or `long sum(int a, int b)` ? // It is impossible to reach a good answer for the compiler in this case so it shows an error
Det är därför, vid överlagring av en metod, att en metod med en annan returtyp också bör ha en annan uppsättning parametrar för att göra den särskiljbar och undvika tvetydighet. Följande är också fel:
index.cs
12345678910static int sum(int a, int b) { return a + b; } // This is wrong and will show an error static long sum(int first, int second) { return first + second; }
Detta beror på att parametrarnas namn inte spelar någon roll, men deras typer gör det. Följande överlagringsfall är giltiga:
index.cs
1234567891011121314151617181920212223242526using System; class ConsoleApp { static int sum(int a, int b) { return a + b; } static long sum(long a, long b) { return a + b; } static string sum(int a, long b, float c) { return Convert.ToString(a + b + c); } static void Main() { Console.WriteLine(sum(5, 7)); // Calls 'int sum()' Console.WriteLine(sum(500000000000, 700000000000)); // Calls 'long sum()' Console.WriteLine(sum(5, 7, 9)); // Calls 'string sum()' } }
1. Hur särskiljer kompilatorn mellan överlagrade metoder?
2. Vilket av följande är ett giltigt exempel på metodöverlagring?
Tack för dina kommentarer!