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#_Anonymous Function - Fatal编程技术网

C# 匿名类型函数声明

C# 匿名类型函数声明,c#,anonymous-function,C#,Anonymous Function,让我们有一个函数: Func<argsFoo, resultFoo> foo= x=>new resultFoo(x); Func<argsBar, resultBar> bar= x=>new resultBar(x); Func<argsBaz, resultBaz> baz= x=>new resultBaz(x); Func foo=x=>newresultfoo(x); Func bar=x=>新结果栏(x); Func baz=

让我们有一个函数:

Func<argsFoo, resultFoo> foo= x=>new resultFoo(x);
Func<argsBar, resultBar> bar= x=>new resultBar(x);
Func<argsBaz, resultBaz> baz= x=>new resultBaz(x);
Func foo=x=>newresultfoo(x);
Func bar=x=>新结果栏(x);
Func baz=x=>新结果baz(x);
我想创建一个复杂函数,它使用上面声明的所有函数

像这样:

Func
<
    Func<argsFoo, resultFoo>,
    Func<argsBar, resultBar>,
    Func<argsBaz,resultBaz>,
    fooBarBazResult
> fooBarBaz=...
Func
<
Func,
Func,
Func,
fooBarBazResult
>fooBarBaz=。。。
关键是这样的声明正在扼杀程序的可读性。在这种情况下,类型推断不起作用

问题:我可以用这样的东西吗

FooBarBaz<typeof(foo),typeof(bar)>,typeof(baz)>>
FooBarBaz,typeof(baz)>>
我试过了,答案是否定的。
任何人都可能有另一种缩短组合函数声明的解决方案吗?

好的,您可以在文件顶部添加一个
,使用
语句简化:

using SomeName = Func<Func<ArgsFoo, ResultFoo>, Func<ArgsBar, ResultBar>, Func<ArgsBaz, ResultBaz>>;

您始终可以声明自己的委托来描述您的方法:

public delegate resultMy MyDelegate(argsMy arg)
并使用较短的名称
MyDelegate

Func<FooDelagate, BatDelegate, BazDelegate>
Func

甚至您也可以命名该委托以简化代码。

这看起来很奇怪。
Func
的最后一个通用参数是返回类型。您有三个具有三种不同返回类型的Func,但仍然试图将它们与一个Func组合,该Func将第一个Func作为输入,并返回一个类似于第三个Func的Func?你到底想在这里做什么?与你的要求无关,但是lambda
(x)=>{return new resultFoo(x);}
(代码中缺少分号!)可以简化一点,变成
x=>new resultFoo(x)
。丹尼尔你是对的,我应该纠正示例中的错误。在这种情况下,我可以使用委托。问题是如何不使用它们:)@gleb.kudr另一个选项是反射,这会使它变得太复杂。委托在更静态的代码(如方法声明)中表现得很好。但是匿名函数被设计成轻量级的(我想),在这种情况下使用委托会使代码变得更加健壮。@gleb.kudr-
Func
是一种委托类型,只是BCL中定义的一种。只能将lambda或匿名函数作为委托实例传递。
Func<FooDelagate, BatDelegate, BazDelegate>