Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-重写学员行动要求<&燃气轮机;_C#_Lambda_Delegates_Anonymous Function - Fatal编程技术网

C#-重写学员行动要求<&燃气轮机;

C#-重写学员行动要求<&燃气轮机;,c#,lambda,delegates,anonymous-function,C#,Lambda,Delegates,Anonymous Function,我需要用预处理这些函数的输入数据的代码来包装许多函数(“包装器”)。下面是使用委托编写的代码(代码尽可能简化,同时仍然可以正常运行并立即编译): 现在,为了简化代码,我想使用动作语法重写它,并内联函数的代码。以下是我试图做的,但我无法编写正确且运行正常的程序: using System; namespace ConsoleApp { class ClientContext { public int i = 1; } class SPRemote

我需要用预处理这些函数的输入数据的代码来包装许多函数(“包装器”)。下面是使用委托编写的代码(代码尽可能简化,同时仍然可以正常运行并立即编译):

现在,为了简化代码,我想使用动作语法重写它,并内联函数的代码。以下是我试图做的,但我无法编写正确且运行正常的程序:

using System;

namespace ConsoleApp
{
    class ClientContext
    {
        public int i = 1;
    }

    class SPRemoteEventProperties
    {
    }

    class Program
    {
        Action<ClientContext, SPRemoteEventProperties> Act;

        // error in next line =>
        public static void Wrapper(Act f, ClientContext clientContext, SPRemoteEventProperties properties)
        {
            ClientContext newClientContext = new ClientContext
            {
                i = clientContext.i * 2
            };

            f(newClientContext, properties);
        }

        static void Main(string[] args)
        {
            Function1(new ClientContext(), new SPRemoteEventProperties());
            Function2(new ClientContext(), new SPRemoteEventProperties());

            // error in next 2 lines =>
            Wrapper((new ClientContext(), new SPRemoteEventProperties()) => Console.WriteLine("Function1: " + clientContext.i));
            Wrapper((new ClientContext(), new SPRemoteEventProperties()) => Console.WriteLine("Function2: " + clientContext.i));

            Console.Read();
        }

        static void Function1(ClientContext clientContext, SPRemoteEventProperties properties)
        {
            Console.WriteLine("Function1: " + clientContext.i);
        }

        static void Function2(ClientContext clientContext, SPRemoteEventProperties properties)
        {
            Console.WriteLine("Function2: " + clientContext.i);
        }
    }
}
使用系统;
名称空间控制台
{
类ClientContext
{
公共int i=1;
}
类SPRemoteEventProperties
{
}
班级计划
{
行动法;
//下一行中的错误=>
公共静态void包装器(Act f、ClientContext、ClientContext、SPRemoteEventProperties属性)
{
ClientContext newClientContext=新ClientContext
{
i=clientContext.i*2
};
f(newClientContext,属性);
}
静态void Main(字符串[]参数)
{
函数1(新的ClientContext(),新的spremoteventproperties());
函数2(新的ClientContext(),新的spremoteventproperties());
//下两行中出现错误=>
包装器((new ClientContext(),new spremoteventproperties())=>Console.WriteLine(“Function1:+ClientContext.i”);
包装器((new ClientContext(),new SPRemoteEventProperties())=>Console.WriteLine(“函数2:+ClientContext.i”);
Console.Read();
}
静态void函数1(ClientContext ClientContext、SPRemoteEventProperties属性)
{
Console.WriteLine(“Function1:+clientContext.i”);
}
静态void函数2(ClientContext ClientContext、SPRemoteEventProperties属性)
{
Console.WriteLine(“Function2:+clientContext.i”);
}
}
}

您能帮我更正此代码吗?

操作的用法与代理不同:

delegate
语法定义了一个类型声明,您可以使用它来定义变量,而
Action
语法已经是该类型,您可以使用它来创建变量。
我不确定我是否清楚,但以下是正确的语法:

publicstaticvoidwrapper(操作f,ClientCo。。。

我不确定我是否完全理解您的意图,我接近了吗

public static void Wrapper(ClientContext clientContext, SPRemoteEventProperties properties, Action<ClientContext, SPRemoteEventProperties> action)
{
    action(newClientContext, properties);
}

...
Wrapper( new ClientContext(), new SPRemoteEventProperties(),(context, properties) => Console.WriteLine("Function1: " + context.i));
publicstaticvoidwrapper(ClientContext-ClientContext,spremoteventproperties属性,Action-Action)
{
操作(newClientContext、属性);
}
...
包装器(new ClientContext(),new spremoteventproperties(),(context,properties)=>Console.WriteLine(“Function1:+context.i”);

一个
动作
有菱形符号(
)与
委托
不同,它包含编译器使其类型安全所需的所有内容。这不同于
委托
,它在定义特定委托之前不是真正类型化的,它告诉编译器所有参数的类型。使用
操作
只需我要把这些字体放进钻石里,瞧,现在已经是一个完整的字体了

由于参数名称前始终有其类型,因此原型应如下所示:

public static void Wrapper(Action<ClientContext, SPRemoteEventProperties> f, ClientContext clientContext, SPRemoteEventProperties properties)
{
publicstaticvoidwrapper(操作f、ClientContext、ClientContext、spremoteventproperties属性)
{

这就是编译器需要知道的关于该参数中包含的内容的所有信息,请按类型进行。

尝试在
包装器中传递
Action f
参数,而不是
Act f
您正在用另一个委托类型替换一个委托类型。以前的委托类型是
Del
。新的委托类型是
Action
>。因此,只需将一个替换为另一个(您只在一个位置使用它),并删除
Del
type,因为它不再需要。
Action Act;
不是类型定义。但您确实尝试使用它。Action f…作为包装器的第一个参数解决了第一个错误。是的,这解决了内联语法部分。谢谢!
public static void Wrapper(ClientContext clientContext, SPRemoteEventProperties properties, Action<ClientContext, SPRemoteEventProperties> action)
{
    action(newClientContext, properties);
}

...
Wrapper( new ClientContext(), new SPRemoteEventProperties(),(context, properties) => Console.WriteLine("Function1: " + context.i));
public static void Wrapper(Action<ClientContext, SPRemoteEventProperties> f, ClientContext clientContext, SPRemoteEventProperties properties)
{