編譯錯誤 · error CS0131
賦值號左邊必須是變數、屬性或索引器
賦值(=)是把一個值存進某個東西。如果左邊沒有儲存空間——常量、字面量、算出來的表示式——就無處可存,編譯器直接明說。
成因一:給常量賦值
const int Max = 100;
Max = 200; // CS0131: const 意味著永遠不能變——這就是契約
const 是編譯期的承諾:值被焊死,永久不變。如果這個值以後確實要變,那它就不是常量:
int max = 100; // 變數……
Console.WriteLine(max);
max = 200; // ……可以隨便重賦
Console.WriteLine(max);
真實程式碼裡的中間選項是 static readonly——啟動時賦一次,之後不可變,但不是編譯期常量。
成因二:賦給了一個表示式
int x = 5;
x + 1 = 10; // 'x + 1' 只是算出一個值——沒有盒子能裝下 10
這幾乎總是寫反的比較或者打錯的目標。你的本意是什麼?
int x = 5;
bool isTen = (x + 1) == 10; // 在比較?那是 '==',兩邊都可以是表示式
Console.WriteLine(isTen);
int x = 5;
x = x + 1; // 存回變數裡:左邊是光禿禿的 x
Console.WriteLine(x);
左邊可以是什麼
| 左邊 | 存進哪裡 | 例子 |
|---|---|---|
| 變數 | 變數本身 | x = 5; |
| 屬性 | 屬性的儲存 | obj.Name = "Ada"; |
| 索引器 | 那個槽位 | arr[0] = 5; / dict["k"] = v; |
| 欄位 | 物件的欄位 | dog.Age = 3; |
其他一切——字面量(5 = x;)、常量、方法呼叫、算術——產出的只是值,手裡沒有盒子,永遠不能站在左邊。
常見問答
C# 裡的 CS0131 是什麼意思?
等號左邊不是能存值的東西——常量、字面量或表示式。左邊只能是變數、屬性、欄位或索引器;本意是比較就用 ==。
C# 裡能賦值給 const 嗎?
永遠不能——const 是編譯期承諾,值永不改變。需要變化的值用普通變數(或啟動時賦一次的 static readonly)。
排查清單
=的左邊:光禿禿的名字、.成員、或[索引]。別的都不行。=是儲存;==是比較。一個字元,天壤之別。const按設計不可重賦——要變就別用 const。x = x + 1合法(把算出的值存回 x);x + 1 = …不合法。