Загрузка...

Перегрузка

Положите в один класс два метода, которые оба используют имя paint. Один заголовок — static void paint(string word). Другой — static void paint(int n). Тела короткие: первое пишет word, второе пишет n. Из Main вызовите paint("ok"); и затем paint(3);. Экран должен показать две строки: ok на первой и 3 на второй. C# не считает второй paint конфликтом. Он считает два заголовка разными методами, потому что списки параметров различаются. Это общее имя с разными списками — то, чему учит эта страница. Оставьте публичный класс с именем Pine.

Одно имя, разные списки

До сих пор каждая новая идея брала свежее имя метода: ring, greet, twice. Здесь имя специально остаётся paint. Меняется то, что стоит между скобками. Один список держит string. Другой список держит int. Компилятор сохраняет оба, потому что эти списки не одинаковы.
Откройте файл Pine. Имя класса остаётся Pine. Эта страница не переименовывает тип. Удалите любое демо twice, которое возвращает n * 2, если такая форма — всё, что ещё держит Main. Удалите любой остаток greet. Удалите любую строку ReadLine. В файле, который вы оставляете, нет ожидания ввода.
Вне Main, но всё ещё внутри фигурных скобок класса, напишите оба заголовка paint. На этой странице оставьте void: каждое тело пишет, и ничего не нужно возвращать в Main через return. Первое тело использует Console.WriteLine(word);. Второе использует Console.WriteLine(n);. Сохраните файл перед запуском. Полная первая программа — в следующем блоке.

Файл, который вы оставляете

Это версия, которую вы запускаете первой. Main держит два вызова. Класс держит два метода paint, которые делят одно имя.

paint string and paint int

csharp
using System;

public class Pine
{
    public static void Main()
    {
        paint("ok");
        paint(3);
    }

    static void paint(string word)
    {
        Console.WriteLine(word);
    }

    static void paint(int n)
    {
        Console.WriteLine(n);
    }
}

Читайте сверху. using System; готовит короткие имена. public class Pine именует тип. public static void Main() — место, где среда выполнения стартует. Первый вызов — paint("ok"). Аргумент — string, поэтому C# запускает тело, которое принимает string word, и пишет ok. Второй вызов — paint(3). Аргумент — int, поэтому C# запускает тело, которое принимает int n, и пишет 3. Имя paint одинаково оба раза. Список внутри скобок выбирает тело. Две строки на экране: ok, затем 3.

Запустите через dotnet run. Программа пишет две строки и останавливается. Она не ждёт, пока вы наберёте текст. Если dotnet run ждёт, в файле ещё есть ReadLine. Удалите эту строку и оставьте два вызова paint плюс два метода paint выше. Экран показывает ok, затем 3. Если обе строки показывают ok, возможно, вы оставили только метод string и пишете фиксированное слово для каждого вызова. Если обе строки показывают 3, возможно, вы оставили только метод int. Оставьте оба заголовка. Если сборка сообщает, что paint уже определён, проверьте, нет ли у обоих заголовков одного списка — например двух копий paint(string word). Перегрузке нужна настоящая разница в списке, а не вторая копия того же заголовка только с другим именем параметра. Не переустанавливайте .NET SDK из‑за экрана с неверными строками.

Второй список с двумя словами

Число параметров тоже может отличаться. Добавьте третью перегрузку, которая принимает два значения string и пишет их в одну строку через пробел. Оставьте первые два метода paint на месте, когда практикуете все три вместе. Для узкого демо только этой формы можно держать файл, в котором есть только этот список.

paint two strings

csharp
using System;

public class Pine
{
    public static void Main()
    {
        paint("hi", "sam");
    }

    static void paint(string a, string b)
    {
        Console.WriteLine(a + " " + b);
    }
}

Это второй файл. Он учит, что число — тоже разница списка. Запустите dotnet run. Экран должен показать одну строку: hi sam. В вызове два аргумента. У метода два параметра. Этого совпадения достаточно, чтобы C# выбрал это тело. Если у вас ещё есть более ранние paint(string word) и paint(int n) в том же классе, можете их оставить. Вызов с двумя значениями string не выберет одноаргументный метод string, потому что числа различаются.
Когда вы кладёте все три перегрузки в один файл для практики, Main может вызвать каждую форму на своей строке. Вызов с одним string всё ещё идёт в paint(string word). Вызов с одним int всё ещё идёт в paint(int n). Вызов с двумя значениями string идёт в paint(string a, string b). Общее имя не стирает эти различия. После того как увидели hi sam, верните сохранённый файл с двумя вызовами, если это форма, которую хотите оставить: paint("ok"); затем paint(3);.

Пустой список рядом со списком string

Метод с пустыми скобками — тоже другой список. Можно держать paint() без параметров рядом с paint(string word). Пустой вызов paint(); запускает тело пустого списка. Вызов paint("go"); запускает тело string.

paint empty and paint string

csharp
using System;

public class Pine
{
    public static void Main()
    {
        paint();
        paint("go");
    }

    static void paint()
    {
        Console.WriteLine("ready");
    }

    static void paint(string word)
    {
        Console.WriteLine(word);
    }
}

Это третий файл. Запустите dotnet run. Экран должен показать ready на первой строке и go на второй. В первом вызове между скобками ничего нет, поэтому он совпадает с paint(). Второй вызов посылает string, поэтому совпадает с paint(string word). Переименование одного метода в paintReady тоже собралось бы, но это другой навык. Эта страница оставляет имя paint и даёт спискам нести различие.

Какой вызов запускает какой заголовок

Читайте вызовы рядом с заголовками. Список аргументов в вызове должен подходить к списку параметров в заголовке. И типы, и число важны на этой начальной форме.

📊 call beside matching paint

Call in Main Header that runs Screen line
paint("ok"); paint(string word) ok
paint(3); paint(int n) 3
paint("hi", "sam"); paint(string a, string b) hi sam
paint(); paint() ready

Частая путаница — написать два метода, которые оба говорят paint(string word), и ожидать, что второй посчитается перегрузкой. Смена только имени параметра на paint(string label) не создаёт новый список для компилятора. Здесь важны тип и число. Другая путаница — вызвать paint(true), когда вы никогда не писали список параметров bool. Тогда сборка не находит подходящий paint. Добавьте заголовок, который принимает нужный тип, или измените вызов на тип, который уже поддерживаете.
Написание Console.WriteLine("paint"); в Main пишет слово paint. Оно не вызывает никакой метод. Оставьте paint("ok");, когда хотите перегрузку, которая принимает string. Оставленный метод twice в том же файле может запутать экран, если Main всё ещё пишет twice(7). Очистите Main до вызовов paint, которые тестируете, и оставьте только перегрузки paint, нужные для этого запуска.
Не вкладывайте метод paint внутрь скобок Main. Методы сидят внутри класса, рядом с Main. Две перегрузки — два соседних метода в том же теле класса.

Вы можете держать одно имя метода и несколько списков параметров в одном классе. C# выбирает тело по списку аргументов вызова. Экран показывает строку из совпавшего тела. Два заголовка с одним списком — не перегрузки. Следующая страница — scope: там вы увидите, какие имена видны внутри метода, а какие остаются снаружи.

Экран держит совпавшее тело

Файл, который вы оставляете, пишет ok, затем 3, когда Main вызывает paint("ok"); и paint(3);. Общее имя paint есть в каждом вызове, и буквы paint не на экране как печатная метка, пока вы их не заключили в кавычки. Вложение метода paint внутрь Main — не та форма, которую строит этот урок.

🧠 Проверьте Свои Знания

Готов к Началу

Проверьте Свои Знания

Бросьте себе вызов с помощью этой интерактивной викторины и узнайте, насколько хорошо вы понимаете тему

❓
5
Вопросы
🎯
70%
Для Прохождения
♾️
∞
Время
🔄
∞
Попытки

📝 Инструкции

  • Внимательно прочитайте каждый вопрос
  • Выберите лучший ответ на каждый вопрос
  • Вы можете пересдавать тест столько раз, сколько захотите
  • Ваш прогресс будет показан вверху