返回自己的C#委托

 郭楠v 发布于 2023-02-13 17:38

基本上我想要一个可以回归的代表.我有一个非常简单的减少我理论上想要的东西:

int i =0;
var x = () => 
{
    if (i > 10)
        return null;

    ++i;
    Debug.Log("keep going");
    return x;
};

var y = x;

while ((y = y()) != null) ;

当然,预期的输出是在控制台中看到"继续"10次.我只是想知道这种语言是否可行(我知道我可以通过for循环实现相同的目标).例如,使用与上面非常相似的代码在JavaScript中进行操作是微不足道的,但我不能让编译器在C#中配合.我认为失败的原因是无法正确描述"x"的类型(Func,你需要类似前向声明的东西.

1 个回答
  • 为了澄清我之前的评论,C#使用静态类型和"reified"泛型.这意味着编译器会跟踪泛型类型的每个参数化.类型Func<Func<int>>与类型不同Func<Func<Func<int>>>.C#不支持任何类型的动态递归,更不用说无限参数化了,类型的天真结构Func<Func<...会涉及无限递归,这种递归会表现为必须跟踪无限多种类型.

    但是,有一些技巧可以使它工作.它们都以某种方式隐藏了函数的返回类型.其他解决方案通过返回弱类型的后期绑定Delegate对象来完成此操作.但是,还有一种静态类型的解决方案.您所需要做的就是定义自己的非泛型delegate对象.

        private delegate InfFunc InfFunc();
        static void Main(string[] args)
        {
            InfFunc f = null;
            int i = 0;
            f = () =>
                {
                    if (i > 10) return null;
                    i++;
                    Debug.WriteLine("Keep going");
                    return f;
                };
            var g = f;
    
            while ((g = g()) != null) ;
            Debug.WriteLine(i);
        }
    

    或者你可以这样做,虽然你的.NET版本不支持DLR:

        static void Main(string[] args)
        {
            Func<dynamic> f = null;
            int i = 0;
            f = () =>
                {
                    if (i > 10) return null;
                    i++;
                    Debug.WriteLine("Keep going");
                    return f;
                };
            var g = f;
    
            while ((g = g()) != null) ;
            Debug.WriteLine(i);
        }
    

    2023-02-13 17:41 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有