Передача делегата в качестве параметра в метод

1

Я пытаюсь ознакомиться с концепцией делегатов на С#. Я создал это консольное приложение:

Program.cs

using System;

namespace DelegatesTest
{
    class Program
    {
        static void Main(string[] args)
        {
            ArithmeticOperation.ArOpDel additionDelegate = new ArithmeticOperation.ArOpDel(ArithmeticOperation.Addition);
            Console.WriteLine(ArithmeticOperation.ConvertResultToString(additionDelegate(10, 5)));
            Console.ReadKey();
        }
    }
}

ArithmeticOperation.cs

using System;

namespace DelegatesTest
{
    public static class ArithmeticOperation
    {
        public delegate int ArOpDel(int x, int y);

        public static string ConvertResultToString(ArOpDel del)
        {
            string result = String.Format("The result of the {0} operation is {1}", del.Method.Name, del.ToString());
            return result;
        }

        public static int Addition(int x, int y)
        {
            return x + y;
        }

        public static int Subtraction(int x, int y)
        {
            return x - y;
        }

        public static int Multiplication(int x, int y)
        {
            return x * y;
        }

        public static int Division(int x, int y)
        {
            return x / y;
        }
    }
}

Как видно из кода, я использую статический класс ArithmeticOperation.cs для выполнения некоторых арифметических операций. Метод ConvertResultToString принимает один из методов арифметических операций в качестве параметра, чтобы отображать результат элегантно в виде строки.

К сожалению, мой код не компилируется. Это дает мне следующую ошибку:

Argument '1': cannot convert from 'int' to 'DelegatesTest.ArithmeticOperation.ArOpDel'

Ошибка указана в этой строке:

Console.WriteLine(ArithmeticOperation.ConvertResultToString(additionDelegate(10, 5)));

Можете ли вы помочь мне решить эту проблему, поскольку я не очень опытен с делегатами? Фактически, я создал это приложение, чтобы узнать о делегатах.

  • 0
    Делегаты являются пре-дженериками C #. Они существуют. По наследственным причинам. Если вы хотите узнать, как делать такие вещи в C #, посмотрите на классы Action<T> и Func<T> .
  • 0
    @nvoigt Спасибо за ваше предложение nvoigt. Я обязательно посмотрю на эти два класса.
Показать ещё 2 комментария
Теги:
delegates
exception

5 ответов

0
Лучший ответ

additionDelegate(10, 5) представляет собой вызов additionDelegate который на самом деле является Addition функции. Таким образом, результат представляет собой целое число.

Для того, чтобы передать делегата, вы должны передать additionDelegate самостоятельно вместо additionDelegate(10, 5). Но в этом случае результат операции не будет доступен в ConvertResultToString если вы не ConvertResultToString его там.

public static string ConvertResultToString(ArOpDel del)
{
     string result = String.Format("The result of the {0} operation is {1}", del.Method.Name, del(10, 5).ToString());
     return result;
}

...

Console.WriteLine(ArithmeticOperation.ConvertResultToString(additionDelegate));
  • 0
    Большое спасибо за ваш вклад. Так что лучший способ - передать числа в ConvertResultToString в качестве параметров, верно?
  • 0
    @JohnDoe в данном конкретном случае - да.
Показать ещё 2 комментария
1

когда вы это делаете

 Console.WriteLine(ArithmeticOperation.ConvertResultToString(additionDelegate(10, 5)));

вы вынуждаете компилятор выполнить метод и возвращать результат, чтобы передать его в качестве аргумента, который в этом случае является int, в то время как ConvertResultTostring ожидает здесь делегата, как вы можете заставить его работать без использования общих

 class Program
    {
        static void Main(string[] args)
        {
            ArithmeticOperation.ArOpDel additionDelegate = ArithmeticOperation.Addition;

            Console.WriteLine(ArithmeticOperation.ConvertResultToString(additionDelegate,5,6));
            Console.ReadKey();
        }
    }
    public static class ArithmeticOperation
    {
        public delegate int ArOpDel(int x, int y);

        public static string ConvertResultToString(ArOpDel del,int x, int y )
        {
            string result = String.Format("The result of the {0} operation is {1}", del.Method.Name, del(x,y).ToString());
            return result;
        }

        public static int Addition(int x, int y)
        {
            return x + y;
        }

        public static int Subtraction(int x, int y)
        {
            return x - y;
        }

        public static int Multiplication(int x, int y)
        {
            return x * y;
        }

        public static int Division(int x, int y)
        {
            return x / y;
        }
    }
  • 0
    Спасибо за ваш вклад Камель. Вот так я и сделал сейчас, и это работает :)
1

Приложение deleagate additionDelegate(10, 5) вернет int, выполнив арифметическую операцию, оно не вернет deleagate что причина ошибки компиляции.

  • 0
    Хм ... Где я должен передать параметры (целые числа) арифметической операции, пожалуйста? Поскольку после удаления параметров выдается ошибка, что ArOpDel не принимает 0 аргументов.
  • 0
    Параметры не проблема. Во время выполнения вы получаете не делегата, а его результат , который представляет собой одно целое число.
1
Console.WriteLine(ArithmeticOperation.ConvertResultToString(additionDelegate(10, 5)));

Вы не передаете делегата здесь. Вы вызываете его, что приводит к int.

Это передаст делегат:

Console.WriteLine(ArithmeticOperation.ConvertResultToString(additionDelegate));

Вам нужно было бы на самом деле вызвать делегата.

  • 0
    Спасибо. Решение теперь компилируется. Однако, где я могу передать числа для арифметической операции, пожалуйста?
0

additionDelegate(10, 5) означает вызов делегата, результатом является тип int, который не соответствует методу ConvertResultToString. вам нужно изменить

Console.WriteLine(ArithmeticOperation.ConvertResultToString(additionDelegate(10, 5)))

в

Console.WriteLine(ArithmeticOperation.ConvertResultToString(additionDelegate))

и изменение

string result = String.Format("The result of the {0} operation is {1}", del.Method.Name, del.ToString()); 

в

string result = String.Format("The result of the {0} operation is {1}", del.Method.Name, del(10,5).ToString());
  • 0
    Спасибо за ваш вклад, Энди.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню