Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.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中的函数具有相同签名的函数#_C#_Types_Recursive Datastructures - Fatal编程技术网

C# 返回与C中的函数具有相同签名的函数#

C# 返回与C中的函数具有相同签名的函数#,c#,types,recursive-datastructures,C#,Types,Recursive Datastructures,在我的应用程序中,我需要一个函数,在完成一些工作后,返回一个与自身签名相同的函数,或者为null: 请注意,这里没有泛型,因为所有类型都是“静态的”(如中,泛型的反面) //type不是一个C#关键字,但请记住 类型RecursiveType=Func; 递归型currentStep//非空的东西 var i=0; while(currentStep!=null){ 当前步骤=当前步骤(i); i+=1; } “currentStep”类似于(这是一个示例。在实际情况中,Foo::A执行一些逻

在我的应用程序中,我需要一个函数,在完成一些工作后,返回一个与自身签名相同的函数,或者为null: 请注意,这里没有泛型,因为所有类型都是“静态的”(如中,泛型的反面)

//type不是一个C#关键字,但请记住
类型RecursiveType=Func;
递归型currentStep//非空的东西
var i=0;
while(currentStep!=null){
当前步骤=当前步骤(i);
i+=1;
}
“currentStep”类似于(这是一个示例。在实际情况中,Foo::A执行一些逻辑来决定它将返回哪个函数,可能是它自己,也可能不是它自己)

class-Foo{
公共静态递归类型fun(int x){
如果(x<3){
返回Foo.A
}
否则{
返回null;
}
}
}

这在C#中是否可能?

您可以这样声明委托类型:

public delegate RecursiveType RecursiveType(int x);
然后将编译:

RecursiveType currentStep = Foo.fun(1);
var i = 0;
while (currentStep != null)
{
    currentStep = currentStep(i);
    i += 1;
}

委托表示一个函数,该函数接受一个
int
,并返回一个具有相同签名的函数。

缺少新的:返回新的Foo.a(){set values};Foo.A不是一个类,它是一个函数(属于类A),所以我不能“新建”它。总是有一个
int
类型的参数吗?或者参数是变量吗?总是一个
int
参数。递归类型在.NET的类型系统中不是一个东西。您可以得到的最接近的方法是在继承或约束子句中使用类型“as-others”(
classc:IEquatable
),但这不能用于模拟这一点(除非非常笨拙,使用具有
调用
方法或类似方法的
IFunc
)。当然,您可以通过使用
object
dynamic
或与强制转换前返回类型相同的非承诺性内容,以非类型安全的方式实现这一点。您还可以将其封装在一个类中,这样可以自行返回。你就是不能用通用的
Func
来做这件事。我忘了递归委托类型是一种东西。这与方法组转换(以及其他委托转换)相结合,允许您或多或少地直接执行此操作(
return Foo.fun
inside
Foo.fun
),也可以使用@JeroenMostert Yes,或者假设
Foo.A
也接受
int
并返回
RecursiveType
,如操作建议的那样。
public delegate RecursiveType RecursiveType(int x);
RecursiveType currentStep = Foo.fun(1);
var i = 0;
while (currentStep != null)
{
    currentStep = currentStep(i);
    i += 1;
}