Я пытаюсь ознакомиться с концепцией делегатов на С#. Я создал это консольное приложение:
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)));
Можете ли вы помочь мне решить эту проблему, поскольку я не очень опытен с делегатами? Фактически, я создал это приложение, чтобы узнать о делегатах.
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));
когда вы это делаете
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;
}
}
Приложение deleagate
additionDelegate(10, 5)
вернет int
, выполнив арифметическую операцию, оно не вернет deleagate
что причина ошибки компиляции.
Console.WriteLine(ArithmeticOperation.ConvertResultToString(additionDelegate(10, 5)));
Вы не передаете делегата здесь. Вы вызываете его, что приводит к int
.
Это передаст делегат:
Console.WriteLine(ArithmeticOperation.ConvertResultToString(additionDelegate));
Вам нужно было бы на самом деле вызвать делегата.
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());
Action<T>
иFunc<T>
.