Что такое перегрузка методов (overloading) и как компилятор выбирает нужную перегрузку? Что будет, если передать null в перегруженный метод с разными типами параметров?

C# / .NET Основы языка Junior

Что это: Перегрузка — несколько методов с одинаковым именем, но разной сигнатурой (типы и количество параметров). Компилятор выбирает наиболее подходящий по правилам разрешения перегрузки: сначала точное совпадение, затем неявные преобразования, затем params и т.д.

Почему важно: Понимание перегрузки критично для чтения чужого кода и предсказания поведения, особенно с null и наследованием — частый сюрприз для джуниоров.

Под капотом: Компилятор C# строит набор кандидатов, отбрасывает неприменимые, затем применяет правила better conversion: более специфичный тип (string vs object) побеждает. При равной специфичности (int? и object для null) — ошибка CS0121: ambiguous.

Типичная ошибка: Разработчик ожидает, что при передаче null вызовется версия с object, но вызывается string (более специфичная), или получает ошибку компиляции при наличии нескольких nullable/reference перегрузок.

void Print(int x) => Console.WriteLine('int');
void Print(string s) => Console.WriteLine('string');
void Print(object o) => Console.WriteLine('object');

Print(null); // Вызовет Print(string), потому что string специфичнее object
// Но если добавить Print(int?)? Будет ошибка неоднозначности