c# compare two generic values

C#Generics

C# Problem Overview


> 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 ?

C# Solutions


Solution 1 - C#

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 - C#

That should work for you.

public bool test<T>(T test, T test2) where T : class
{
    return (test != test2);
}

This is simply pasted from the examples that were commented on your question.

Solution 3 - C#

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.

Solution 4 - C#

You can overload the .Equals() method on your objects and change your evaluation to:

return (!valueInDB.Equals(valueFromView));

Assuming that valueInDB and valueFromView are objects. Your example variables aren't named the same as those used in the compare, so I had to assume.

EDIT: Got beat by 3 seconds! A note on overloading, if you need to compare values within a type, the basic .Equals() from the Object class won't be enough, as it will only do a memory compare for complex types. You'll need to overload and provide the implementation of how you want the object to be compared.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionbernhardruschView Question on Stackoverflow
Solution 1 - C#ShuggyCoUkView Answer on Stackoverflow
Solution 2 - C#CalvinRView Answer on Stackoverflow
Solution 3 - C#devioView Answer on Stackoverflow
Solution 4 - C#Jay SView Answer on Stackoverflow