كيفية المقارنة بين اثنين من العناصر من نفس ولكن المقيد نوع عام من أجل المساواة ؟ [مكررة]

StackOverflow https://stackoverflow.com/questions/336884

سؤال

ممكن مكررة:
لا يمكن المشغل == تطبق على أنواع عامة في C# ؟

لدي التالية فئة عامة مترجم يشكو من أن "Operator '!=' cannot be applied to operands of type 'TValue' and 'TValue'"(انظر CS0019):

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

إذا لم تقيد TValue إلى class, يمكنني استخدام Object.Equals().منذ أن كنت بحاجة إلى هذا يملك البنيات والطبقات سأكون سعيدا جدا إذا كنت يمكن تجنب ذلك.

لذا فإن السؤال هو, كيف يمكن المقارنة بين اثنين من العناصر من نفس ولكن المقيد نوع عام من أجل المساواة ؟

هل كانت مفيدة؟

المحلول

هل حاولت شيئا من هذا القبيل ؟

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

            if (!object.Equals(_value, value))
            {
                _value = value;
                OnPropertyChanged("Value");
            }
        }
    }
}

نصائح أخرى

ثلاثة خيارات:

  • تقييد TValue لتنفيذ IEquatable<TValue> ثم اتصل x.Equals(y)
  • تأخذ معلمة أخرى من نوع IEqualityComparer<TValue> واستخدام ذلك
  • استخدام EqualityComparer<TValue>.Default لإجراء مقارنات

يمكنك دائما مزيج المباراة خيارات 2 و 3 من الدورة الافتراضي الافتراضي comparer ، ولكن أيضا تسمح محدد واحد أن تكون المقدمة.

  • يساوي() القيمة أنواع
  • ReferenceEquals() المرجع أنواع

هو 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");
            }
        }
    }
}

أعتقد != المشغل لا يمكن تطبيقها هنا لأن هناك حالات حيث لا يمكن استخدامها.فعلى سبيل المثال ، != لا يمكن استخدامها لمقارنة البنيات إلا إذا قارن بين المشغلين (== !=) يتم محمل بشكل زائد.

بالطبع يمكنك مقارنة اللغة البنيات ، مثل int != int, لكنني غير متأكد من كيفية تنفيذ هذا.

ذلك لأن TValue يمكن أن يكون مخصص البنية لا يمكن استخدام != المشغل.

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;
        }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top