【问题标题】:C# Default Literal Always Returning False, .Equals()C# 默认文字总是返回 False,.Equals()
【发布时间】:2018-03-22 21:50:54
【问题描述】:

如何使用默认文字比较 ValueType

我试过这个,但它返回 _darkBlue.Equals(default) 总是返回 false

static Color _darkBlue;

public static Color DarkBlue => _darkBlue.Equals(default) ? (_darkBlue = Color.FromHex("2980b9")) : _darkBlue;

注意:本例中的ColorXamarin.Forms.Color

编辑:复制样本:https://github.com/brminnick/ColorEqualsRepro

【问题讨论】:

  • 你想让它成为线程安全的单例吗?
  • @maccettura 好点,我没有考虑线程安全!不一定,但您介意共享线程安全和非线程安全的答案吗?我很想现在看到这两个!
  • 你能提供一个minimal reproducible example 来证明这个问题吗?乍一看,它应该可以工作。
  • 一个结构,根据定义,不能是单例。
  • Color.FromHex("2980b9") 并不是一个昂贵的操作,值得尝试推迟执行它。只需在构建包含对象时执行它。您可能会花费更多的资源来尝试推迟执行该操作,而不是在可能需要之前完成工作。

标签: c# xamarin.forms c#-7.1


【解决方案1】:

原来问题出在.Equals。编译器将.Equals(default) 解释为.Equals(default(object))

.Equals 更改为== 解决了这个问题。

public static Color DarkBlue => _darkBlue == default ? (_darkBlue = Color.FromHex("2980b9")) : _darkBlue;

另一种解决方案是使用.Equals(default(Color))

public static Color DarkBlue => _darkBlue.Equals(default(Color)) ? (_darkBlue = Color.FromHex("2980b9")) : _darkBlue;

另一种解决方案,使用Color.IsDefault

public static Color DarkBlue => _darkBlue.IsDefault ? (_darkBlue = Color.FromHex("2980b9")) : _darkBlue;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多