4 .net c# lambda functional-programming
我有以下代码执行非常简单的操作:递归访问Node对象树并计算名为Info的属性的总和.
using System;
namespace ConsoleApplication11
{
static class Program
{
static void Main(string[] args)
{
//tree of nodes
var node = new Node {Info = 1, Left = new Node {Info = 1}};
//print out sum
Console.WriteLine(node.Sum());
Console.ReadLine();
}
//find sum of Info of each node
static int Sum(this Node node)
{
return node.Info + (node.Left == null ? 0 : Sum(node.Left)) + (node.Right == null ? 0 : Sum(node.Right));
}
}
public class Node
{
public int Info { get; set; }
public Node Left { get; set; }
public Node Right { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
一个更好的解决方案是
using System;
namespace ConsoleApplication11
{
static class Program
{
static Func<Node, int> fSum = (node) => node.Info + (node.Left == null ? 0 : fSum(node.Left)) + (node.Right == null ? 0 : fSum(node.Right));
static void Main(string[] args)
{
//tree of nodes
var node = new Node {Info = 1, Left = new Node {Info = 1}};
//print out sum
Console.WriteLine(fSum(node));
Console.ReadLine();
}
}
public class Node
{
public int Info { get; set; }
public Node Left { get; set; }
public Node Right { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题和疑问是:为什么我不能在方法中有这个功能?我收到错误:使用未分配的局部变量'fSum'
using System;
namespace ConsoleApplication11
{
static class Program
{
static void Main(string[] args)
{
//I am getting error: Use of unassigned local variable 'fSum'
Func<Node, int> fSum = (node) => node.Info + (node.Left == null ? 0 : fSum(node.Left)) + (node.Right == null ? 0 : fSum(node.Right));
//tree of nodes
var n = new Node {Info = 1, Left = new Node {Info = 1}};
//print out sum
Console.WriteLine(fSum(n));
Console.ReadLine();
}
}
public class Node
{
public int Info { get; set; }
public Node Left { get; set; }
public Node Right { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 10
你可以在方法中使用它,只需稍微捏一下就可以解决你的赋值表达式的RHS包含使用未明确赋值的局部变量的事实:
Func<Node, int> fSum = null;
fSum = node => node.Info + (node.Left == null ? 0 : fSum(node.Left))
+ (node.Right == null ? 0 : fSum(node.Right));
Run Code Online (Sandbox Code Playgroud)
这绕过了明确的任务问题.它偶尔会有些烦人,你可以想象修复它会很好......但可能会有一些有趣的情况,它确实是一个问题,但用语言术语来描述相对困难.
换句话说:我怀疑修复明确的赋值规则,只允许在lambda表达式中读取局部变量,这样做是安全的(其中lambda表达式是赋值变量和委托的一部分)直到分配完成后才会被执行)会增加比相对少量的利益更多的复杂性.
| 归档时间: |
|
| 查看次数: |
631 次 |
| 最近记录: |