编译错误 · 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 = …不合法。