如何用默认字面量比较值类型?Xamarin.Forms.Color.Equals(default)恒为false
问题分析与解决方案
这个问题的根源在于**default关键字的类型推断**,导致你实际调用的不是值类型的相等比较方法:
当你写_darkBlue.Equals(default)时,由于没有明确指定default的类型,编译器会匹配Color.Equals(object)这个重载,此时default会被解析为default(object)也就是null。而Xamarin.Forms.Color是值类型,值类型的实例装箱后永远不可能等于null,所以这个比较永远返回false,自然永远不会触发你的赋值逻辑。
修复方案
你只需要明确指定default的类型为Color,让编译器调用Color.Equals(Color)这个值类型的重载方法,就能正确比较了:
static Color _darkBlue; public static Color DarkBlue => _darkBlue.Equals(default(Color)) ? (_darkBlue = Color.FromHex("2980b9")) : _darkBlue;
更直观的写法
另外,Color类型已经重载了==运算符,你也可以直接用相等运算符来判断,代码可读性更强:
static Color _darkBlue; public static Color DarkBlue => _darkBlue == default(Color) ? (_darkBlue = Color.FromHex("2980b9")) : _darkBlue;
本质上,default(Color)对应的就是Color值类型的默认初始化状态(即ARGB全为0的Transparent颜色),和静态字段_darkBlue的初始值完全一致,这样第一次访问DarkBlue属性时,就会触发赋值逻辑,之后再访问就会直接返回已初始化的颜色值。
内容的提问来源于stack exchange,提问作者Brandon Minnick
相关产品推荐
相关产品推荐

