在C#单线程环境中,能否使a==1 && a==2 && a==3成立并输出Hurraa?
当然可以!在C#单线程环境下,我们有好几种巧妙的方法能让a == 1 && a == 2 && a == 3这个看似不可能的表达式返回true,进而执行Console.WriteLine("Hurraa")。下面给你拆解几个实用的方案:
方案1:自定义类型 + 重载相等运算符
我们可以定义一个类,内部维护一个可变的状态值,每次执行相等比较时先匹配当前值,再自动递增状态:
public class MagicA { private int _currentValue = 1; // 重载==运算符,和整数比较时触发状态变更 public static bool operator ==(MagicA instance, int target) { return instance._currentValue++ == target; } // 必须配套重载!=运算符以符合C#规范 public static bool operator !=(MagicA instance, int target) { return !(instance == target); } // 重写Equals和GetHashCode,避免编译器警告 public override bool Equals(object obj) { return obj is MagicA other && _currentValue == other._currentValue; } public override int GetHashCode() { return HashCode.Combine(_currentValue); } } // 测试代码 var a = new MagicA(); if (a == 1 && a == 2 && a == 3) { Console.WriteLine("Hurraa"); }
原理:第一次比较a == 1时,_currentValue是1,匹配成功后自增为2;第二次比较a == 2时,当前值正好是2,匹配后自增为3;第三次a == 3完美匹配,整个表达式就变成true了。
方案2:利用隐式转换自动变更状态
另一种思路是通过隐式转换,让自定义类型在和整数比较时自动转换为递增的数值:
public class MagicA { private int _currentValue = 1; // 定义隐式转换:把MagicA实例转成int时,返回当前值并自增 public static implicit operator int(MagicA instance) { return instance._currentValue++; } } // 测试代码 var a = new MagicA(); if (a == 1 && a == 2 && a == 3) { Console.WriteLine("Hurraa"); }
原理:当a和整数比较时,C#会自动触发隐式转换,每次转换都会返回当前的_currentValue然后自增。三次比较依次拿到1、2、3,自然满足条件。
方案3:用属性Getter实现动态值
如果不想自定义类,也可以用一个包含属性的类,让属性的Getter每次被访问时返回递增的值:
public class MagicHolder { private int _aValue = 1; public int a { get { return _aValue++; } } } // 测试代码 var holder = new MagicHolder(); if (holder.a == 1 && holder.a == 2 && holder.a == 3) { Console.WriteLine("Hurraa"); }
原理:每次访问holder.a时,Getter都会返回当前的_aValue然后自增。三次比较分别触发三次Getter调用,拿到的数值正好是1、2、3,表达式成立。
这些方案都依赖于单线程下的顺序执行,状态修改是按比较顺序依次进行的,不会出现并发导致的混乱,完全可靠。
内容的提问来源于stack exchange,提问作者zsubzwary
相关产品推荐
相关产品推荐

