從this post(而不僅僅是)我們得到了++操作符不能應用於返回值的表達式的問題。 顯而易見,5 ++最好寫成5 + 1.我只想總結一下增量/減量運算符的全部內容。所以,讓我們來看看這些代碼片段,這些代碼可能對至少第一次在++中卡住的人有幫助。通過一個值而不是一個變量,屬性和索引器來限制post/pre increment操作符
// Literal
int x = 0++; // Error
// Constant
const int Y = 1;
double f = Y++; // error. makes sense, constants are not variables actually.
int z = AddFoo()++; // Error
摘要:++適用於變量,屬性(通過合成糖)和索引器(相同)。
現在關心部位 - 任何文字表述在CSC優化,因此,當我們在寫,說
int g = 5 + 1; // This is compiled to 6 in IL as one could expect.
IL_0001: ldc.i4.6 // Pushes the integer value of 6 onto the evaluation stack as an int32.
對於5 ++並不意味着5變爲6,它可能是5 + 1的簡寫,就像x ++ = x + 1 這個限制背後的真正原因是什麼?
int p = Foo()++ //? yes you increase the return value of Foo() with 1, what's wrong with that?
讚賞可能導致邏輯問題的代碼示例。
現實生活中的一個例子可能是,執行一個比數組更多的操作。
for (int i = 0; i < GetCount()++; i++) { }
也許缺少使用opts編譯器團隊來避免類似的功能? 我不堅持認爲這是我們缺乏的一個特性,只是想了解編譯器編寫者的這個黑暗面,儘管我不是。但我知道c++ allows this when returning a reference in the method。我既不是C++的人(非常貧窮的知識),也只是想獲得限制的真正主旨。 像,是不是因爲c#的人選擇限制超過值表達式的++或有明確的情況下導致不可預知的結果?
喬恩,這確實是功能選擇的好點。然後(i ++ vs i + = 1),你認爲++/- 運算符是否被選爲C#語言特徵主要是爲了紀念c/C++世界的歷史(例如getcount()++是可能的情況下)?比方說,如果你現在正在發明一種全新的語言,你現在會在C#中爲變量添加這個運算符嗎? –
@Arman:我會*可能*仍然包括'i ++'和'++ i',是的。它們足夠方便且足夠有用,可以包含,但是我*不認爲我想包含'get_count()++'。我不認爲能夠做到這是一件好事。 –
Jon,'很可能' - 很少但是有疑問:)好吧,我對這個功能感到滿意,因爲大多數開發者只是想知道語言/編譯器專業人士的意見。與C#中有一個很好的功能相比,這不會是壞事,例如x#會將浮點數增加一半,就像在半音中用音符表示:)。謝謝回覆。 –