假设我在C#中有以下代码块:
static void Main(string[] args)
{
List<Func<int>> fs = new List<Func<int>>();
for (int i = 0; i < 5; i++)
fs.Add(() => { return i; });
for (int i = 0; i < 5; i++)
Console.WriteLine(fs[i]());
Console.ReadLine();
}
当我运行它时,我希望它可以打印
0
1
2
3
4
但它打印
5
5
5
5
5
代替。我的理解是Func中的代码仅保留i
的地址,而不获取i
的值,因此应避免这种方法。
所以我的问题是,有没有办法捕获局部变量并将它们按值传递给Func
?
参考方案
您可以在for循环中使用作用域来捕获i值的副本:
static void Main(string[] args)
{
List<Func<int>> fs = new List<Func<int>>();
for (int i = 0; i < 5; i++)
{
var copyOfi = i;
fs.Add(() => { return copyOfi; });
}
for (int i = 0; i < 5; i++)
Console.WriteLine(fs[i]());
Console.ReadLine();
}
Java中的“ <<”运算符 - java最喜欢的语句来自Java的Character类:(1 << Character.PARAGRAPH_SEPARATOR)) >> type PARAGRAPH_SEPARATOR是字节,type是整数。这句话中的操作员,他们做什么?如何以及在哪里可以使用这些运算符?这是oracles java.lang.Character文档。该类中…
LeetCode题解拼凑硬币小Q十分富有,拥有非常多的硬币,小Q拥有的硬币是有规律的,对于所有的非负整数K,小Q恰好各有两个面值为2^k的硬币,所有小Q拥有的硬币就是1,1,2,2,4,4,8,8.....小Q有一天去商店购买东西需要支付n元钱,小Q想知道有多少种方案从他拥有的硬币中选取一些拼凑起来恰好是n元(如果两种方案某个面值的硬币选取的个数不一样就考虑为不一样的方案)输入:输入包…
Python lmfit约束:a <b <c - python我在Python中使用lmfit来拟合一些数据,其中包括拟合变量a,b和c。我需要确保a <b <c。我发现http://cars9.uchicago.edu/software/python/lmfit_MinimizerResult/constraints.html谈到需要定义为不等式和设置虚拟变量的约束。例如,如果我想要a + b <=…
将谓词<T>转换为Func <T,bool> - c#我有一个包含成员Predicate的类,希望在Linq表达式中使用该类:using System.Linq; class MyClass { public bool DoAllHaveSomeProperty() { return m_instrumentList.All(m_filterExpression); } private IEnumerable&…
为什么不能将(1 << 31)分配给ulong变量? (错误25常数值…无法转换…) - c#为什么这种分配会产生可编译错误:Constant value '-2147483648' cannot be converted to a 'ulong',在这种情况下我必须使用unchecked (...)?ulong xDummy30 = (1 << 30); // works ulong xDummy…