c# compare two generic values [duplicate]
Possible Duplicate:
Can’t operator == be applied to generic types in C#?
I've coded something like this:
public bool IsDataChanged()
{
T value1 = GetValue2;
T value2 = GetValue1();
return (valueInDB != valueFromView);
}
Right now the function doesn't compile with the error "Operator '!=' cannot be applied to operands of type 'T' and 'T'". What do I have to do to make this function work ?
Solution 1:
You cannot use operators on generic types (except for foo == null which is special cased) unless you add where T : class to indicate it is a reference type (then foo == bar is legal)
Use EqualityComparer<T>
.Default to do it for you. This will not work on types which only supply an operator overload for == without also either:
- implement
IEquatable<T>
- overrides object.Equals()
In general implementing the == operator and not also doing at least one of these would be a very bad idea anyway so this is not likely to be an issue.
public bool IsDataChanged<T>()
{
T value1 = GetValue2;
T value2 = GetValue1();
return !EqualityComparer<T>.Default.Equals(value1 , value2);
}
If you do not restrict to IEquatable<T>
then the EqualityComparer default fallback may cause boxing when used with value types if they do not implement IEquatable<T>
(if you control the types which are being used this may not matter). I am assuming you were using =! for performance though so restricting to the Generic type will avoid accidental boxing via the Object.Equals(object) route.
Solution 2:
Your type needs to implement the IComparable or IEquatable interface.
Probably you then need to rewrite a!=b as !(a==b), or call the CompareTo() or Equals() method explicitly.