2015-10-16 70 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一起使用,所以在這些情況下,嘗試賦值可能沒有意義。