Вызов делегата приводит к ошибке «без подписи» - PullRequest
0 голосов
/ 27 ноября 2018

Я хочу написать на экране результат, который я получаю после выполнения действий внизу кода.Но я не хочу использовать 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 Ответ

0 голосов
/ 27 ноября 2018

У вас уже есть правильный код для вызова вашего делегата в обеих ветвях 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...