Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# lambda表达式中的不可能值_C#_Arrays_Concurrency_Lambda - Fatal编程技术网

C# lambda表达式中的不可能值

C# lambda表达式中的不可能值,c#,arrays,concurrency,lambda,C#,Arrays,Concurrency,Lambda,谁能告诉我,这个代码怎么可能: for (byte i = 0; i < someArray.Length; i++) { pool.QueueTask(() => { if (i > 0 && i < someArray.Length) { myFunction(i, someArray[i], ID); } }

谁能告诉我,这个代码怎么可能:

for (byte i = 0; i < someArray.Length; i++)
{
    pool.QueueTask(() =>
        {
            if (i > 0 && i < someArray.Length)
            {
                myFunction(i, someArray[i], ID);
            }
        });
}
for(字节i=0;i
{
if(i>0&&i
位于使用
indexootfrangeexception
调用
myFunction
的行上,因为
i
变量的值等于
someArray.Length
?我真的不明白

注意:
pool
是包含2个线程的简单线程池的实例


注2:for循环中的类型
byte
是有意放置的,因为数组长度不能超过byte max值(根据前面创建数组的逻辑),我需要变量
I
byte

类型,使用
byte
作为索引似乎是过早的微优化,如果您的数组包含的元素超过255个,那么它确实会带来麻烦


此外,当我们这样做时:您提到您正在线程池上运行。您是否确保
someArray
在代码运行时不会超出范围?

您的代码正在
i
上创建一个闭包,并且每次执行时它都将成为
someArray.Length
。最后传递到
QueueTask()
操作
保留for循环的状态,并在执行时使用
i
的值。这是一个可编译的代码示例,它表达了同样的问题

static void Main(string[] args)
{
    var someArray = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    var fns = new List<Action>();

    for (int i = 0; i < someArray.Length; i++)
    {
        fns.Add(() => myFunction(i, someArray[i]));
    }

    foreach (var fn in fns) fn();
}

private static void myFunction(int i, int v)
{
    Console.WriteLine($"{v} at idx:{i}");
}

相关阅读:

您的数组包含的元素不超过256个,是吗?@Flynn1179它包含100个元素(这就是为什么我使用byte)byte比int慢。@M.kazemAkhgary实际上,我使用byte是因为避免了从int到byte的转换。该函数接受第一个参数字节,它作为某些数据结构的数据值,我将其存储在具有自定义布局的二进制文件中-一个字节,一个长,等等。。。谢谢你的努力,但这不适用于我的情况。@Sehnsucht-谢谢!实际上,C#5.0和
foreach
循环有一个相关的突破性变化,这可能也会引起您的兴趣。
static void Main(string[] args)
{
    var someArray = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    var fns = new List<Action>();

    for (int i = 0; i < someArray.Length; i++)
    {
        var local = i;
        fns.Add(() => myFunction(local, someArray[local]));
    }

    foreach (var fn in fns) fn();
}

private static void myFunction(int i, int v)
{
    Console.WriteLine($"{v} at idx:{i}");
}