简体   繁体   English

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

[英]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)?

I have the watches with the values written below and a property with the accessors written below. 我有手表,上面写着值,下面是属性,上面写着存取器。 Although the values are boxed strings and their types are the same, and the actual text in the strings is exactly the same, the condition d.Value.Value != d.Value.DefaultValue is true . 尽管这些值是带框的字符串,并且它们的类型相同,并且字符串中的实际文本完全相同,但条件d.Value.Value != d.Value.DefaultValuetrue

I have put the watches below and I was simply surprised by their values. 我把手表放在下面,它们的价值让我感到惊讶。

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
            });
        }
    }
}

Watches values when the breakpoint on _Value != value was hit: 命中_Value != value的断点时_Value != value

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

I expected that d.Value.Value != d.Value.DefaultValue will not be equal to d.Value.DefaultValue.Equals(d.Value.Value) , but they are the same. 我期望d.Value.Value != d.Value.DefaultValue将不等于d.Value.DefaultValue.Equals(d.Value.Value) ,但是它们是相同的。

My working code: 我的工作代码:

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
            });
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM