Hvordan å sammenligne to elementer av det samme, men ubegrenset generisk type for likestilling?

stemmer
8

Mulig Duplicate:
Kan ikke operator == brukes på generiske typer i C #?

Jeg har følgende generisk klasse og kompilatoren klager over at Operator '!=' cannot be applied to operands of type 'TValue' and 'TValue' (se CS0019 ):

public class Example<TValue>
{
    private TValue _value;
    public TValue Value
    {
        get { return _value; }
        set
        {
            if (_value != value) // <<-- ERROR
            {
                _value= value;
                OnPropertyChanged(Value);
            }
        }
    }
}

Hvis jeg begrense TValuetil class, kunne jeg bruke Object.Equals(). Siden jeg trenger dette for boths structs og klasser jeg ville være veldig glad hvis jeg kan unngå det selv.

Så spørsmålet er, hvordan kan jeg sammenligne to elementer av det samme, men ubegrenset generisk type for likestilling?

Publisert på 03/12/2008 klokken 11:44
kilden bruker
På andre språk...                            


6 svar

stemmer
12

Visste du prøve noe som dette?

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

            if (!object.Equals(_value, value))
            {
                _value = value;
                OnPropertyChanged("Value");
            }
        }
    }
}
Svarte 03/12/2008 kl. 12:02
kilden bruker

stemmer
7

Tre alternativer:

  • Begrense TValue å implementere IEquatable<TValue>og deretter ringex.Equals(y)
  • Ta en annen parameter av type IEqualityComparer<TValue>og bruke det
  • Bruk EqualityComparer<TValue>.Defaulttil å utføre sammenligninger

Du kan alltid mikse og matche alternativer 2 og 3, selvfølgelig - som standard standard comparer, men også tillate en bestemt en som skal gis.

Svarte 03/12/2008 kl. 12:47
kilden bruker

stemmer
2
  • Er lik () for verditypene
  • ReferenceEquals () for referansetypene
Svarte 03/12/2008 kl. 11:48
kilden bruker

stemmer
1

Er IComparable et alternativ?

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");
            }
        }
    }
}
Svarte 03/12/2008 kl. 12:39
kilden bruker

stemmer
0
public static bool operator ==(EntityBase<T> entity1, EntityBase<T> entity2)
        {
            if ((object)entity1 == null && (object)entity2 == null)
            {
                return true;
            }

            if ((object)entity1 == null || (object)entity2 == null)
            {
                return false;
            }

            if (Comparer<T>.Default.Compare(entity1.Id, entity2.Id) != 0)
            {
                return false;
            }

            return true;
        }
Svarte 14/07/2011 kl. 10:17
kilden bruker

stemmer
0

Jeg tror !=operatøren kan ikke brukes her fordi det er tilfeller der det ikke kan brukes. For eksempel, !=kan ikke brukes til å sammenligne structs, med mindre hos operatører ( == !=) er overbelastet.

Selvfølgelig kan du sammenligne språk structs, som int != int, men jeg er ikke sikker på hvordan dette er implementert.

Så, fordi TValue kan være en egendefinert struct, det kan ikke bruke !=operatør.

Svarte 03/12/2008 kl. 12:39
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more