2015-10-16 76 views
0

让我们考虑这个片段的C#代码:C#值分配给特定索引列表<string>

 List<string> a = new List<string>(); 
    a.Add("word1"); 
    a.Add("word2"); 

现在可以说,我想有而不是单词2“WORD3”。我可以说

 a[1]="word2"; 

但如果我尝试

 a.ElementAt(2) ="word2"; 

然后我得到一个错误说左边必须是一个变量。

此语法对引用类型和值类型的行为方式相同。 有人可以解释为什么第二种语法有缺陷吗?

+2

首先是带'set'访问器的索引器。第二件事是一种方法,它会返回一些价值。 – PetSerAl

+2

语法没有缺陷,您需要查看'ElementAt'的文档,它会返回给您指定位置的元素。 – Habib

+0

@PetSerAl:很酷,它返回一些值,但它不应该返回一个引用它在该索引处持有的对象? – ForeverStudent

回答

4

这是一个方法调用,它返回一个值::

a.ElementAt(2) 

您可以

可以使用它的返回值,它在序列中指定索引处返回元素将值存储在变量中并将其他值分配给该变量。但方法调用本身不能分配给。方法调用不是可以赋值的容器。

数组索引器直接引用数组(集合)变量中的元素,您可以将其分配给某个元素。该方法调用没有引用任何东西,它返回的东西。

所以,你可以分配给一个变量:

x = "some value"; 

即使是一个集合变量的指标:

x[0] = "some value"; 

但并不是一个方法调用:

SomeMethod() = "some value"; 
+0

谢谢大卫,我的理解是有缺陷的,我想。ElementAt(2)将返回对象的引用,以便我可以分配新对象。 – ForeverStudent

1

ElementAt是一种方法,您无法为其分配值。

var x= a.ElementAt(0); 
0
a.ElementAt(2) ="word2"; 

在这里你正在调用一个方法并获取结果,然后尝试分配结果。不允许。如果你有这个:

var foo = a.ElementAt(2); 
foo = "word2"; 

那很好。

当您使用a[1]="word2";时,会发生一些语法糖。您正在调用列表中的方法,而不是简单的分配。请注意,根据列表的实现方式,按索引访问元素可能是一项昂贵的操作。

简而言之,使用固定长度列表的数组,可以更改大小的集合的列表。

+0

应该明确的是,在我的第一个代码示例中,列表中的值不会更改,foo会被分配给新的字符串。 –

0

=是一个赋值操作符。它将右侧的值赋予左侧的值。

有什么可以在左侧的限制。

this MSDN reference引用:

赋值的左操作数必须是属于变量,属性访问,索引器访问,或一个事件的访问的表达式。

ElementAt()是一个方法调用,因此它不能位于赋值运算符的左侧。

0

除了其他答案,除了它是一种方法而不是变量外,请注意该方法在IEnumerable<T>上运行。在这种特殊情况下,您试图为列表分配一个值,但ElementAt不限于列表,但可以在任何序列上进行操作。

List<T>有一个索引器,它有一个setter,因此它可以被分配。但其他类也执行IEnumerable<T>可能不会,即使它们可以与ElementAt一起使用,所以在这些情况下,尝试赋值可能没有意义。