C#中重载前缀与后缀--运算符报错问题求助
解决C#重载前缀/后缀--运算符的编译错误
你的代码出现Overloadable binary operator expected错误,核心原因是编译器对后缀--运算符的签名识别异常,同时你的实现逻辑对于值类型(若Rational是结构体)存在无效修改问题,以下是修正方案:
修正后的运算符重载代码
// 前缀--:先修改再返回新值 public static Rational operator --(Rational a) { // 针对值类型,创建新实例避免修改传值副本 Rational modified = new Rational(a.Mona - a.Mechane, a.Mechane); return modified.reduce(); } // 后缀--:先返回原始值,再触发修改 public static Rational operator --(Rational a, int dummy) { Rational original = new Rational(a.Mona, a.Mechane); // 值类型传值修改无效,编译器会自动将变量赋值为前缀--的结果 return original; }
关键注意事项
- 后缀运算符的签名规范:后缀
--必须通过第二个int类型参数区分前缀版本,参数名可任意命名(如dummy),无需对其做无意义赋值。 - 值类型的处理逻辑:若
Rational是结构体(值类型),传值参数的修改不会影响外部变量,因此前缀运算符需返回新的修改后实例,后缀运算符仅返回原始实例即可,变量的更新由编译器自动处理。 - 符合标准行为:前缀
--应返回修改后的值,后缀--应返回修改前的原始值,保持与C#内置运算符的行为一致。
内容的提问来源于stack exchange,提问作者SHACHA
相关产品推荐
相关产品推荐

