Как сравнить две переменные в штучной упаковке (не зная, могут ли они быть приведены к типу другого, или являются ли они значениями или ссылочными типами)? - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть часы со значениями, написанными ниже, и свойство с аксессорами, написанными ниже.Хотя значения представляют собой строки в штучной упаковке и их типы одинаковы, а фактический текст в строках точно такой же, условие d.Value.Value != d.Value.DefaultValue равно true.

Я поставил часы ниже, и я былпросто удивлены их значениями.

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: true
  2. d.Value.Value: "Нет" (объект {строка})
  3. d.Value.DefaultValue: "Нет" (объект {строка})
  4. "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), но они одинаковы.

1 Ответ

1 голос
/ 30 апреля 2019

Мой рабочий код:

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