编译错误 · 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)。

排查清单