赋值的左侧必须是变量,属性或索引器

时间:2015-04-28 15:47:53

标签: c#

我收到错误,我不知道原因:

static void decoupeTableau(IEnumerable<int> dst, IEnumerable<int> src)
{
    for (int i = 0; i < src.Count() && i < 4; ++i)
        dst.ElementAt(i) = src.ElementAt(i); // Here
}

错误:

  

作业的左侧必须是变量,属性或索引器

为什么我得到它?

2 个答案:

答案 0 :(得分:2)

  

为什么我得到它?

因为你有一个赋值运算符,左边是方法调用。你有什么期望呢?那叫什么代码?分配必须设置变量的值,或者为属性调用setter。这不是做其中任何一件事。

基本上,你不能这样做 - 对于IEnumerable<T>它甚至没有意义,因为它可以是只读的,生成的等等。

也许您想要IList<int>代替:

static void DecoupeTableau(IList<int> dst, IEnumerable<int> src)
{ 
    int i = 0;
    foreach (var value in src.Take(4))
    {
        dst[i] = value;
        i++;
    }
}

请注意,此代码也可能 更高效 - 在循环中调用Count()ElementAt可能非常昂贵。 (例如,对于生成器,每次调用Count()时都必须迭代整个流 - 所以如果这是理论上无限的流,它甚至都不会完成,例如随机的整数序列。)

答案 1 :(得分:0)

IEnumerable的一点是你可以通过项目循环,但不能更改列表。如果您需要实际更改列表,则需要IList或数组或类似名称。

你得到的错误是因为ElemetAt是一个函数,而不是元素本身。

使用for循环遍历IEnumerable也是一个特别糟糕的主意,你需要一个foreach循环。