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

C# 赋值的左侧必须是变量、属性或索引器,c#,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 } static void decoupeTableau

我遇到了一个错误,我不知道为什么:

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
}
static void decoupeTableau(IEnumerable dst,IEnumerable src)
{
对于(int i=0;i
错误:

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

为什么我会得到它

为什么我会得到它


因为有一个赋值操作符,左边是一个方法调用。你以为那会怎么样?那叫什么代码?assignment必须设置变量的值,或者调用属性的setter。这两件事都做不到

基本上,你不能这样做——对于
IEnumerable
来说,它甚至没有意义,因为它可以是只读的、生成的等等

也许您想要一个
IList

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

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

IEnumerable的功能是,您可以循环遍历项目,但不能更改列表。如果需要实际更改列表,则需要IList或array或类似工具

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


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

dst.ElementAt(i)
将返回一个值,例如number
42
,然后您尝试为其分配一些新值。另外,我认为除了这个方法之外,您需要的是
dst=src.Take(4).Concat(dst.Skip(Math.Min(4,src.Count()))错误说明了问题所在。“因为你有一个赋值运算符,左边是一个方法调用”-为什么当方法返回一个对象时会出现问题?@Sipo:我不确定你为什么认为这不会是问题。方法调用的结果是一个值,而不是一个变量。你不能给一个值赋值,那是什么意思?可能相关:该方法不返回对象。它返回一个引用。任何东西都不会返回实际对象。每个归类为值的表达式要么是值类型值,要么是引用(或指针)。如果它返回一个引用,
Method()=new Something()
是否意味着该引用现在引用了另一个对象?@Sipo:我仍然不清楚您希望它做什么。现在哪个引用引用了不同的对象?您是否建议如果我从一个方法返回一个私有字段的值(比如
字符串
引用),调用者应该能够更改我字段的值以引用另一个字符串?非常肯定不是……我相信我现在明白了问题所在。非常感谢。