Как сравнить два элемента того же, но неограниченного универсального типа для равенства? [дубликат]

Большой разницы нет. Возвращаемое перечисление повторяется один раз для каждого экземпляра службы.

Здесь приведен код, взятый из источников на GitHub .

if (this.instanceListeners == null)
{
    this.instanceListeners = this.userServiceInstance.CreateServiceInstanceListeners();
}

var endpointsCollection = new ServiceEndpointCollection();
var listenerOpenedCount = 0;

foreach (var entry in this.instanceListeners)
{
    var communicationListener = entry.CreateCommunicationListener(this.serviceContext);
    this.AddCommunicationListener(communicationListener);
    var endpointAddress = await communicationListener.OpenAsync(cancellationToken);
    endpointsCollection.AddEndpoint(entry.Name, endpointAddress);
    listenerOpenedCount++;

    var traceMsg = entry.Name.Equals(ServiceInstanceListener.DefaultName)
        ? "Opened communication listener with default name."
        : $"Opened communication listener with name {entry.Name}.";

    ServiceTrace.Source.WriteInfoWithId(TraceType, this.traceId, traceMsg);
}

8
задан Community 23 May 2017 в 12:00
поделиться

5 ответов

Вы пробовали что-то вроде этого?

public class Example<TValue>
{
    private TValue _value;
    public TValue Value
    {
        get { return _value; }
        set
        {

            if (!object.Equals(_value, value))
            {
                _value = value;
                OnPropertyChanged("Value");
            }
        }
    }
}
12
ответ дан 5 December 2019 в 07:37
поделиться
  • Равняется () для типов значения
  • ReferenceEquals () для ссылочных типов
2
ответ дан 5 December 2019 в 07:37
поделиться

Действительно ли IComparable является опцией?

public class Example<TValue> where TValue: IComparable
{
    private TValue _value;
    public TValue Value
    {
        get { return _value; }
        set
        {

            if (_value.CompareTo(value) != 0)
            {
                _value = value;
                OnPropertyChanged("Value");
            }
        }
    }
}
1
ответ дан 5 December 2019 в 07:37
поделиться

Три опции:

  • Вынудите TValue реализовывать IEquatable<TValue> и затем звоните x.Equals(y)
  • Возьмите другой параметр типа IEqualityComparer<TValue> и используйте это
  • Использовать EqualityComparer<TValue>.Default выполнить сравнения

Вы могли всегда смешивать и соответствовать опциям 2 и 3, конечно - значение по умолчанию к компаратору по умолчанию, но также и позволять определенному быть обеспеченным.

7
ответ дан 5 December 2019 в 07:37
поделиться

Я думаю != оператор не может быть применен здесь, потому что существуют случаи, где он не может использоваться. Например, != не может использоваться для сравнения структур, если сравнить операторы (== !=) перегружаются.

Конечно, можно сравнить структуры языка, как int != int, но я не уверен, как это реализовано.

Так, потому что TValue может быть пользовательской структурой, он не может использовать != оператор.

0
ответ дан 5 December 2019 в 07:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: