让我们考虑这段C#代码:
List<string> a = new List<string>();
a.Add("word1");
a.Add("word2");
现在假设我想要“word3”而不是word2。我可以说
a[1]="word2";
但如果我尝试
a.ElementAt(2) ="word2";
然后我得到一个错误,说左侧必须是变量。
此语法对引用类型和值类型的行为方式相同。 有人可以解释为什么第二种语法存在缺陷吗?
答案 0 :(得分:5)
这是一个返回值的方法调用:
a.ElementAt(2)
您可以将值存储在变量中,并为该变量指定其他值。但无法将方法调用本身分配给。方法调用不是可以为其分配值的容器。
数组索引器直接引用数组(集合)变量中的元素,您可以为其赋值。方法调用没有引用任何内容,它返回的东西。
所以你可以分配一个变量:
x = "some value";
甚至是集合变量的索引:
x[0] = "some value";
但不是方法调用:
SomeMethod() = "some value";
答案 1 :(得分:1)
答案 2 :(得分:0)
a.ElementAt(2) ="word2";
在这里,您调用方法并获取结果,然后尝试分配结果。不允许。如果你有这个:
var foo = a.ElementAt(2);
foo = "word2";
那时没关系。
当你使用a[1]="word2";
时,会发生一些语法糖。您正在调用列表中的方法,而不是简单的赋值。请注意,根据列表的实现方式,按索引访问元素可能是一项昂贵的操作。
简而言之,使用固定长度列表的数组,列出可以改变大小的集合。
答案 3 :(得分:0)
=
是一个赋值运算符。它将右侧的值分配给左侧的值。
对左侧的内容有限制。
赋值的左操作数必须是分类为变量,属性访问,索引器访问或事件访问的表达式。
ElementAt()
是方法调用,因此它不能位于赋值运算符的左侧。
答案 4 :(得分:0)
因为 ElementAt 只是为了获取指定索引的元素,所以不能指定它(https://msdn.microsoft.com/en-us/library/bb299233(v=vs.110).aspx)
您可以尝试删除索引处的项目并插入新项目,如下所示:
a.RemoveAt(2);
a.Insert(2, "word3");
答案 5 :(得分:0)
除了其他答案之外,除了它是方法而不是变量之外,请注意该方法在IEnumerable<T>
上运行。在这种特殊情况下,您尝试为列表分配值,但ElementAt
不限于列表,但可以对任何序列进行操作。
List<T>
有一个索引器,它有一个setter,因此可以分配它。但是其他也实现IEnumerable<T>
的类可能没有,即使它们可以与ElementAt
一起使用,所以在这些情况下尝试分配甚至没有意义。