C#赋值表达式的值:是左操作数还是右操作数的值?
C#赋值表达式结果的疑惑解答
你提到的疑惑核心在于对C#赋值表达式结果的精准定义——文档之所以表述为“赋值表达式的结果是赋给左操作数的值”,而非直接说“等于右操作数的值”,是因为这是覆盖所有场景的严谨表述,并非冗余。
以下两种场景能体现这种表述的必要性:
类型转换场景
当右操作数需要转换为左操作数的类型时,赋给左操作数的是转换后的值,可能和原始右操作数的值不同。比如:double c = 3.9; int b; int a = (b = c); // b被赋值为3(double转int截断小数),a的结果也是3,而非c的3.9此时
b = c的结果是赋给b的3,和c的原始值存在差异,文档的表述准确描述了实际行为。自定义类型的转换逻辑
如果自定义了类型的隐式/显式转换运算符,赋值时左操作数的值会经过转换逻辑处理,和右操作数原始值不同。比如:public class MyNumber { public int Value { get; set; } public static implicit operator MyNumber(int num) { return new MyNumber { Value = num * 2 }; } } int c = 5; MyNumber b; MyNumber a = (b = c); // b.Value为10,a.Value也为10,而c是5这里
b = c的结果是转换后的MyNumber实例,和c的原始值完全不同,文档的表述完美覆盖这类场景。
简言之,文档的表述是为了涵盖所有赋值场景,包括存在类型转换、自定义逻辑的情况。直接说“等于右操作数的值”会遗漏这些特殊场景,而“赋给左操作数的值”才是普适的准确定义。
内容的提问来源于stack exchange,提问作者nandu
相关产品推荐
相关产品推荐

