Компілятор визначає який саме метод потрібно викликати за типом фактичних параметрів. Цей процес називається дозволом (resolution) перевантаження. Тип повертаємого методом значення в дозволі не бере участь. Механізм дозволу заснований на достатньо складному наборі правил, сенс яких зводиться до того, щоб використовувати метод з найбільш відповідними аргументами і видати повідомлення, якщо такий не знайдеться. Допустимо, є чотири варіанти методу, що визначає найбільше значення:
// Повертає найбільше з двох цілих:
int max(int а, int b )
// Повертає найбільше з трьох цілих:
int max(int а, int b, int e)
// Повертає найбільше з першого параметра і довжини другого:
int max (int а, string b)
// Повертає найбільше з другого параметра і довжини першого:
int max (string b, int а)
…
…
Console.WriteLine( max (1,2));
Console.WriteLine( max (1,2,3));
Console.WriteLine( max (1,"2"));
Console.WriteLine( max ("1",2));
При виклику методу max компілятор вибирає варіант методу, відповідний типу переданих в метод аргументів (у приведеному прикладі будуть послідовно викликані всі чотири варіанти методу). Якщо точної відповідності не знайдено, виконуються неявні перетворення типів відповідно до загальних правил, наприклад, bool і char в int, float в double і тому подібне. Якщо перетворення неможливе, видається повідомлення про помилку. Якщо відповідність на одному і тому ж етапі може бути отримане більш ніж одним способом, вибирається “кращий з варіантів, тобто варіант, що містить менші кількість перетворень. Якщо існує декілька варіантів, з яких неможливо вибрати кращий, видається повідомлення про помилку.
Перевантажені методи мають одне ім'я, але повинні розрізнятися параметрами, точніше, їх типами і способами передачі (out або ref). Наприклад, методи, заголовки яких приведені нижче, мають різні сигнатури і вважаються перевантаженими:
int max( int а, int b )
int max( int а, ref int b)
Перевантаження методів є проявом поліморфізму, однієї з основних властивостей ООП. Програмістові набагато зручніше пам'ятати одне ім'я методу і використовувати його для роботи з різними типами даних, а рішення про те, який варіант методу викликати, покласти на компілятор. Цей принцип широко використовується в класах бібліотеки .NET. Наприклад, в стандартному класі Console метод Writeline перевантажений 19 разів для виведення величин різних типів.