C#:递归泛型

凯文·迈尔

是否可以在C#中定义递归泛型?或更具体地说:可以将此代码(TypeScript)转换为C#吗?

type U<T> = (a: U<T>) => T;

function f<T>(a: U<T>): T {
    return a(a)
}

function g<T>(a: T): boolean {
    return false
}

console.log(f(g))

该类型U<T>在其定义中使用自身。

谢谢

杰罗恩·莫斯特(Jeroen Mostert)

如果我正确理解TypeScript,则可能是C#中最接近的等效项:

delegate T U<T>(U<T> a);

static void Main() {
    T f<T>(U<T> a) => a(a);
    bool g<T>(T a) => false;

    Console.WriteLine(f<bool>(g));
}

我们必须显式提供一个类型f,因为必须进行委托转换,并且编译器不会自动执行该转换。如果我们创建g实际的委托实例而不是局部函数,则可以避免这种情况,尽管此解决方案缺乏对称性:

static void Main() {
    T f<T>(U<T> a) => a(a);
    U<bool> g = a => false;

    Console.WriteLine(f(g));
}

我们无法直接进行f委托,因为我们必须将通用参数保持打开状态,而C#不允许这样做。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章