C# - 将委托作为参数传递给方法
本文关键字:参数传递 方法 | 更新日期: 2023-09-27 18:26:11
我正在尝试熟悉C#中委托的概念。 到目前为止,我已经创建了这个控制台应用程序:
程序.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();
}
}
}
算术运算.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来执行一些算术运算。 方法将算术运算方法之一作为参数,以便将结果优雅地显示为字符串。
不幸的是,我的代码无法编译。 它给了我以下错误:
Argument '1': cannot convert from 'int' to 'DelegatesTest.ArithmeticOperation.ArOpDel'
此行出现错误:
Console.WriteLine(ArithmeticOperation.ConvertResultToString(additionDelegate(10, 5)));
你能帮我解决这个问题吗,因为我对代表们不是很有经验? 事实上,我创建了这个应用程序来了解委托。
additionDelegate(10, 5)
将通过执行算术运算返回int
,它不会返回deleagate
这是编译错误的原因。
Console.WriteLine(ArithmeticOperation.ConvertResultToString(additionDelegate(10, 5)));
您不是在这里传递委托。您正在调用它,这会导致int
.
这将通过委托:
Console.WriteLine(ArithmeticOperation.ConvertResultToString(additionDelegate));
不过,您需要在某个地方实际呼叫代表。
当你这样做时
Console.WriteLine(ArithmeticOperation.ConvertResultToString(additionDelegate(10, 5)));
您正在强制编译器执行该方法并返回结果以将其作为参数传递,在这种情况下它是一个整数,而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;
}
}
additionDelegate(10, 5)
是对additionDelegate
的调用,它实际上是一个Addition
函数。因此,结果是一个整数。
为了传递委托,您应该传递additionDelegate
本身而不是additionDelegate(10, 5)
。但是,在这种情况下,除非您在那里调用操作的结果,否则操作的结果在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));
additionDelegate(10, 5)
表示调用委托,结果是与ConvertResultToString
方法存根不匹配的int类型。你需要改变
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());