【问题标题】:c# gerneric task is completely unclearc#通用任务完全不清楚
【发布时间】:2014-06-29 15:40:53
【问题描述】:

我面临一项旧考试的任务,但我不知道它是关于什么的:

class Demo
{ 
    satic void Main()
    {
        Func <int,int>  xxx = null;
        xxx = n => n <=  1 ? 1:n * xxx(n-1);

        for (int m=1; m < 6; m++)
        {   
            Console.WriteLine("m=  {0}  xxx = {1}", m, xxx(m));
        }
    }
}

有一些类型为 int,int 的通用构造,但这是什么? 有一个 if-else 语句,但这里发生了什么?特别是使用 => 运算符?如果有人能告诉我这里发生了什么,我将非常感激。

我们应该更正这段代码并写下打印输出。但我们不知道第一行会发生什么。

更新:在 Visual Studio 中,未发现任何错误。那么我们为什么要发现错误呢?输出如下:

  m=1 xxx=1
  m=2 xxx=2
  m=3 xxx=6
  m=4 xxx=24
  m=5 xxx=120

我仍然不清楚发生了什么。

【问题讨论】:

  • 您是否尝试过将文本光标移动到“=>”并按 F1(在 Visual Studio 中)?
  • 为什么不将它写入 Visual Studio,编译,修复一些小的语法错误,然后查看输出。 (顺便说一句,这是一个recursive lambda
  • 代码中的错误来自于从图片中转移。没有任何错误,那么我们应该纠正什么,大声笑
  • 你考试的时候我会笑得更开心,哈哈。

标签: c# generics printing task out


【解决方案1】:
  1. 您的代码中充满了拼写错误和缺失的字符;使用编译器或DotNetFiddle 时应该很容易找到这些。

  2. 它有什么作用?它打印出 m! (factorial of m) 1..5

  3. 感兴趣的两条线:

    Func &lt;int,int&gt; xxx = null;

声明一个带有int 类型参数的新Func Delegate,它返回int。该委托还没有绑定任何功能(即null)。您可以将这样的委托视为类似于 c++ 中的函数指针。因此,它或多或少是一个持有函数的变量(参见MSDN),可以像xxx(m) 一样调用整数m

xxx = n => n <=  1 ? 1:n * xxx(n-1);

通过 Lambda 表达式将功能分配给委托 xxx。 (见MSDN

xxx = 是 assgigment,n =&gt; ... 是 lambda 表达式,基本上说,对于输入参数 n,返回以下内容

n &lt;= 1 ? 1:n * xxx(n-1); 是要为n 执行的功能。也可以写成

xxx = n => {
        if (n <=1) return 1;
        return n* xxx(n-1);

    };

由于xxx 已经在上面的行中定义,它可以像其他方法一样在这里调用。

【讨论】:

  • 谢谢您,您的回答很完美。但是,在vs中运行时代码中仍然没有任何错误。所以我有什么可以纠正的吗?
  • 在您的原始未编辑问题(我在回答中提到的)中存在以下错误:satic void Main() 应该是static void Main(string[] args)(即缺少字符,缺少参数),xxx = n =&gt; n &lt;= 1 ? 1:n * xxx(n-1) (缺少分号)和Console.WirteLine 应该是Console.WriteLine(类型)。没有办法,Visual Studio 不会显示这些错误并成功执行您的代码。
  • 是的,很抱歉造成混乱。那是我的错误,因为我必须从原始代码(照片)中手动编写代码。原始代码编译没有错误。也许我们的教授还想迷惑我们
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-09
  • 1970-01-01
相关资源
最近更新 更多