Как правильно использовать void и return в С#?

Всем привет. Самостоятельно изучаю C#. Начал решать задачи с проекта Эйлера. Задача 1. (сначала хочу просто вывести в консоль все числа кратные 3 и 5)
class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(summaNumbers(10));
        }
        static void summaNumbers(int x)
        {
            for (int i = 0; i <= x; i++)
            {
                if (i % 3 == 0 && i % 5 == 0)
                {
                    Console.WriteLine(i); 
                }
            }
        }
    }

В Console.WriteLine(summaNumbers(10)) возникает ошибка: не удается преобразовать из "void" в "bool".

Второй вариант задачи. Возвращает уже сумму чисел кратных 3 и 5.
class Program
    {
        static void Main(string[] args)
        {
            int z = summaNumbers(10);
            Console.WriteLine(z);
        }
        static int summaNumbers(int x)
        {
            for (int i = 0; i <= x; i++)
            {
                int temp = 0; 
                if (i % 3 == 0 && i % 5 == 0)
                {
                    temp = temp + i;
                }
                return temp;
            }
        }
    }

Здесь возникает ошибка в методе summaNumbers(int x): не все ветви кода возвращают значение.
Вопросы:
1. Почему метод Console.WriteLine() пытается провести преобразования, он ведь должен просто вывести в консоль?
2. Где я в методе summaNumbers(int x) не поставил return.
3. Пробовал менять тип возвращаемого значения метода summaNumbers(int x): void, int, ставил return в разные строчки кода, все равно ошибка. Объясните как вообще использовать void и return, или дайте ссылку где почитать.
4. Может быть ошибка алгоритме или в других частях кода, подскажите.
Спасибо.
  • Вопрос задан
  • 5208 просмотров
Решения вопроса 2
birdy90
@birdy90
1. вы хотите вывести summaNumbers, но этот метод возвращает void, а это нельзя сконвертировать/вывести, поэтому ошибка. Метод должен возвращать что-либо.
2. если у вас цикл не выполнится ни разу - return ни разу не будет вызван. кстати, стоит обратить внимание, что если вы таки попадёте в цикл, то выйдете из него в первой же итерации. я бы вынес int temp = 0; до цикла, а return temp; - после, тогда вы посчитаете сумму интересующих вас чисел и после цикла вернёте результат. ошибки уже не будет, так как return будет обязательно вызван.
3. если вы пишете void, то return ... не будет работать. можно, если память мне не изменила, использовать return; (без указания возвращаемого значения), тогда будете просто "вываливаться" из метода. если же возращаться должен не void, а что-то конкретное, то это что-то и нужно вернуть, при этом вызов return должен выполниться при любых условиях. то есть, если return окажется внутри условия, то, опять же, в случае если условие не выполнится - вы не выполните и return. поэтому return должен присутствовать также либо в else, либо после условия
4. читай выше
Ответ написан
alexsandr0000
@alexsandr0000
Программист C#/C++/C
Вот пример, думаю он объяснит
public class Program
    {
        public static void Main(string[] args)
        {
            //Просто вызываем функцию
            summaNumbers(100);
            Console.WriteLine();
            Console.WriteLine(summaNumbersAndReturnCount(100));
        }
        
        static void summaNumbers(int x)
        {
            for (int i = 0; i <= x; i++)
            {
                //Условие проверяющее, что допустим дальше расчитывать смысла нет и поэтому
                //вызываем return завершающее данную функцию и возвращающее управление Main
                //if(condition == 0)
                //    return;
                
                if (i % 3 == 0 && i % 5 == 0)
                {
                    Console.WriteLine(i); 
                }
            }
        }
        
        static int summaNumbersAndReturnCount(int x)
        {
            var _count = 0;
            for (int i = 0; i <= x; i++)
            {
                //Условие проверяющее, что допустим дальше расчитывать смысла нет и поэтому
                //вызываем return завершающее данную функцию и возвращающее управление Main
                //if(condition == 0)
                //    return;
                
                if (i % 3 == 0 && i % 5 == 0)
                {
                    _count++;
                }
            }
            
            return _count;
        }
    }
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
no_one
@no_one Автор вопроса
Все понял, всем спасибо, нужно было просто вызвать метод.
static void Main(string[] args)
        {
            Numbers(10); // вызов метода без использования Console.WriteLine(), т.к. он и так прописан в методе Numbers(10)
        }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы