如何比较两个装箱变量(不知道它们是否都可以转换为对方的类型,或者它们是值类型还是引用类型)?

How to compare two boxed variables (not knowing if they each can be casted to the other's type, or whether they are value or reference types)?

我的手表的值写在下面,属性 的访问器写在下面。虽然这些值都是带框的字符串并且它们的类型相同,并且字符串中的实际文本完全相同,但是条件 d.Value.Value != d.Value.DefaultValuetrue.

我把手表放在下面,我只是对它们的价值感到惊讶。

internal object DefaultValue { get; set; } = null;

internal object _Value = null;
internal object Value
{
    get
    {
        return _Value;
    }
    set
    {
        if (_Value != value)
        {
            _Value = value;
            Changed?.Invoke(this, new SettingValueChangedEventArgs()
            {
                IsInitialization = FirstChangeIsInitialization
            });
        }
    }
}

_Value != value 上的断点被击中时观察值:

  1. d.Value.Value != d.Value.DefaultValue : 真
  2. d.Value.Value : "None" (对象 {string})
  3. d.Value.DefaultValue : "None" (对象 {string})
  4. "test" : "test" (字符串)
  5. ((object)"test").GetType():对象{字符串}
  6. d.Value.Value.GetType():对象{字符串}
  7. d.Value.DefaultValue.GetType():对象{字符串}
  8. d.Value.DefaultValue.Equals(d.Value.Value) : 真

我预计 d.Value.Value != d.Value.DefaultValue 不会等于 d.Value.DefaultValue.Equals(d.Value.Value),但它们是相同的。

我的工作代码:

internal object _Value = null;
internal object Value
{
    get
    {
        return _Value;
    }
    set
    {
        if ((value == null && _Value != null) ||
            (value != null && _Value == null) ||
            (value != null && _Value != null && !_Value.Equals(value)))
        {
            _Value = value;
            Changed?.Invoke(this, new SettingValueChangedEventArgs()
            {
                IsInitialization = FirstChangeIsInitialization
            });
        }
    }
}