Вызов делегата приводит к ошибке "без подписи"

Я хочу написать на экране результат, который я получаю после выполнения действий в нижней части кода. Но я не хочу использовать Console.WriteLine() в функции "IF", ​​я хочу назвать его как значение делегирования, но оно говорит "без знака". (сайт говорит в основном код, но мне больше ничего не нужно говорить, поэтому я просто набираю что-то здесь:D)

namespace ConsoleApp5
{
    class program
    {
        delegate int first(int a, int b);  
        static void Main()
        {
            first beta;
            int result;
            Console.Write("insert number A: ");
            int.TryParse(Console.ReadLine(), out int a);
            if (a == 0)
            {
                Console.WriteLine("not a number");
                Environment.Exit(0);
            }

            Console.Write("insert number B: ");
            int b = int.Parse(Console.ReadLine());
            if (a == 0)
            {
               Console.WriteLine("not a number");
               Environment.Exit(0);
            }

            Console.WriteLine("plus(1) or minus (0)");  
            int c = int.Parse(Console.ReadLine());

            if (c == 1)
            {
                beta = plus;
                result = beta(a, b);  
                Console.WriteLine(result);
            }
            else if (c == 0)
            {
               beta = minus; 
               result = beta(a, b); 
               Console.WriteLine(result);
            }

            beta(); // PROBLEM HERE, I WANT TO WRITE ANSWER FROM THIS 
                    //instead of "Console.WriteLine(result);" inside function

       }

        private static int plus(int a, int b)
        {
            return a + b;
        }

        private static int minus(int a, int b)
        {
            return a - b;
        }
    }
}

Пример того, что я имею в виду, я хочу достичь, но немного по-другому.

using System;
namespace consoleApplication4
{
  class Program{

Delegate void Message();

     static void Main (string[] args)
{

Message mes;

if (DateTime.Now.Hour < 12)
{
mes=GoodMorning;
}

else{
mes=GoodEvening;
}

mes();  //this does what i want here but in code above something is missing
Console.ReadKey();
}


private static void GoodMorning(){
console.WriteLine("Good Morning");
}
Private static void GoodEvening(){
Console.WriteLine("Good Evening");
}}}

1 ответ

Решение

У вас уже есть правильный код для вызова вашего делегата в обеих ветвях if, Таким образом, чтобы код почти работал, эти две строки вызывают beta нужно переместить из обеих веток:

    if (c == 1)
    {
       beta = plus;
    }
    else if (c == 0)
    {
       beta = minus; 
    }
    result = beta(a, b); 
    Console.WriteLine(result);

Теперь другая проблема все еще там - ваша if проверки имеют 3 результата (0, 1, другие), но beta назначается только в двух случаях. Таким образом, мы должны добавить этот "другой" случай тоже с желаемым выводом (или просто неудачей), switch оператор выражает это лучше, чем цепочка ifs:

    switch (c)
    {
      case 1: beta = plus; break;
      case 0: beta = plus; break;
      default: beta = (a,b)=>""; break;
      // alternatively to fail: default: return 0;
    }
    result = beta(a, b); 
    Console.WriteLine(result);
Другие вопросы по тегам