How to compare generic types in c#

Equals(Type)

Determines if the underlying system type of the current Type is the same as the underlying system type of the specified Type.

Equals(Object)

Determines if the underlying system type of the current Type object is the same as the underlying system type of the specified Object.

Equals(Type)

public: bool Equals(Type ^ o); public: virtual bool Equals(Type ^ o); public bool Equals (Type o); public virtual bool Equals (Type? o); public virtual bool Equals (Type o); override this.Equals : Type -> bool Public Function Equals (o As Type) As Boolean Public Overridable Function Equals (o As Type) As Boolean Boolean

true if the underlying system type of o is the same as the underlying system type of the current Type; otherwise, false.

Examples

The following example uses Equals to compare two types.

using System; using System.Reflection; class Example { public static void Main() { Type a = typeof(System.String); Type b = typeof(System.Int32); Console.WriteLine("{0} == {1}: {2}", a, b, a.Equals(b)); // The Type objects in a and b are not equal, // because they represent different types. a = typeof(Example); b = new Example().GetType(); Console.WriteLine("{0} is equal to {1}: {2}", a, b, a.Equals(b)); // The Type objects in a and b are equal, // because they both represent type Example. b = typeof(Type); Console.WriteLine("typeof({0}).Equals(typeof({1})): {2}", a, b, a.Equals(b)); // The Type objects in a and b are not equal, // because variable a represents type Example // and variable b represents type Type. //Console.ReadLine(); } } // /* This code example produces the following output: System.String == System.Int32: False Example is equal to Example: True typeof(Example).Equals(typeof(System.Type)): False */ open System type Example() = class end do let a = typeof<string> let b = typeof<int> printfn $"{a} == {b}: {a.Equals b}" // The Type objects in a and b are not equal, // because they represent different types. let a = typeof<Example> let b = Example().GetType() printfn $"{a} is equal to {b}: {a.Equals b}" // The Type objects in a and b are equal, // because they both represent type Example. let b = typeof<Type> printfn $"typeof({a}).Equals(typeof({b})): {a.Equals b}" // The Type objects in a and b are not equal, // because variable a represents type Example // and variable b represents type Type. (* This code example produces the following output: System.String == System.Int32: False Example is equal to Example: True typeof(Example).Equals(typeof(System.Type)): False *) Imports System.Reflection Class Example Public Shared Sub Main() Dim a As Type = GetType(System.String) Dim b As Type = GetType(System.Int32) Console.WriteLine("{0} = {1}: {2}", a, b, a.Equals(b)) ' The Type objects in a and b are not equal, ' because they represent different types. a = GetType(Example) b = New Example().GetType() Console.WriteLine("{0} is equal to {1}: {2}", a, b, a.Equals(b)) ' The Type objects in a and b are equal, ' because they both represent type Example. b = GetType(Type) Console.WriteLine("typeof({0}).Equals(typeof({1})): {2}", a, b, a.Equals(b)) ' The Type objects in a and b are not equal, ' because variable a represents type Example ' and variable b represents type Type. 'Console.ReadLine() End Sub End Class ' ' This code example produces the following output: ' System.String = System.Int32: False ' Example is equal to Example: True ' typeof(Example).Equals(typeof(System.Type)): False '

See also

Applies to

Equals(Object)

public: override bool Equals(System::Object ^ o); public override bool Equals (object o); public override bool Equals (object? o); override this.Equals : obj -> bool Public Overrides Function Equals (o As Object) As Boolean Boolean

true if the underlying system type of o is the same as the underlying system type of the current Type; otherwise, false. This method also returns false if:

  • o is null.

  • o cannot be cast or converted to a Type object.

Examples

The following example uses Equals(Object) to compare various Type object instances with various Object instances.

using System; using System.Collections.Generic; using System.Reflection; public class Example { public static void Main() { Type t =typeof(int); Object obj1 = typeof(int).GetTypeInfo(); IsEqualTo(t, obj1); Object obj2 = typeof(String); IsEqualTo(t, obj2); t = typeof(Object); Object obj3 = typeof(Object); IsEqualTo(t, obj3); t = typeof(List<>); Object obj4 = (new List<String>()).GetType(); IsEqualTo(t, obj4); t = typeof(Type); Object obj5 = null; IsEqualTo(t, obj5); } private static void IsEqualTo(Type t, Object inst) { Type t2 = inst as Type; if (t2 != null) Console.WriteLine("{0} = {1}: {2}", t.Name, t2.Name, t.Equals(t2)); else Console.WriteLine("Cannot cast the argument to a type."); Console.WriteLine(); } } // The example displays the following output: // Int32 = Int32: True // // Int32 = String: False // // Object = Object: True // // List`1 = List`1: False // // Cannot cast the argument to a type. open System open System.Reflection let isEqualTo (t: Type) (inst: obj) = match inst with | :? Type as t2 -> printfn $"{t.Name} = {t2.Name}: {t.Equals t2}\n" | _ -> printfn "Cannot cast the argument to a type.\n" do let t = typeof<int> typeof<int>.GetTypeInfo() |> isEqualTo t typeof<String> |> isEqualTo t let t = typeof<obj> typeof<obj> |> isEqualTo t let t = typeof<ResizeArray<_>>.GetGenericTypeDefinition() let obj4: obj = (ResizeArray<String>()).GetType() isEqualTo t obj4 let t = typeof<Type> let obj5: obj = null isEqualTo t obj5 // The example displays the following output: // Int32 = Int32: True // // Int32 = String: False // // Object = Object: True // // List`1 = List`1: False // // Cannot cast the argument to a type. Imports System.Collections.Generic Imports System.Reflection Module Example Public Sub Main() Dim t As Type = GetType(Integer) Dim obj1 As Object = GetType(Integer).GetTypeInfo() IsEqualTo(t, obj1) Dim obj2 As Object = GetType(String) IsEqualTo(t, obj2) t = GetType(Object) Dim obj3 As Object = GetType(Object) IsEqualTo(t, obj3) t = GetType(List(Of )) Dim obj4 As Object = (New List(Of String())).GetType() IsEqualTo(t, obj4) t = GetType(Type) Dim obj5 As Object = Nothing IsEqualTo(t, obj5) End Sub Private Sub IsEqualTo(t As Type, inst As Object) Dim t2 As Type = TryCast(inst, Type) If t2 IsNot Nothing Then Console.WriteLine("{0} = {1}: {2}", t.Name, t2.Name, t.Equals(t2)) Else Console.WriteLine("Cannot cast the argument to a type.") End If Console.WriteLine() End Sub End Module ' The example displays the following output: ' Int32 = Int32: True ' ' Int32 = String: False ' ' Object = Object: True ' ' List`1 = List`1: False ' ' Cannot cast the argument to a type.

Two things are particularly worth noting about the example:

  • The comparison of a Type object that represents an integer with a TypeInfo object that represents an integer return true because TypeInfo is derived from Type.

  • The comparison of a Type object that represents a IList<T> object (an open generic type) with a List(Of String) object (a closed generic type) returns false.

Remarks

This method overrides Object.Equals. It casts o to an object of type Type and calls the Type.Equals(Type) method.

See also

Applies to

public: abstract int Compare(T x, T y); public abstract int Compare (T x, T y); public abstract int Compare (T? x, T? y); abstract member Compare : 'T * 'T -> int Public MustOverride Function Compare (x As T, y As T) As Integer Int32

A signed integer that indicates the relative values of x and y, as shown in the following table.

Value Meaning
Less than zero x is less than y.
Zero x equals y.
Greater than zero x is greater than y.

Examples

The following example defines a comparer of Box objects that can be used instead of the default comparer. This example is part of a larger example provided for the Comparer<T> class.

public class BoxLengthFirst : Comparer<Box> { // Compares by Length, Height, and Width. public override int Compare(Box x, Box y) { if (x.Length.CompareTo(y.Length) != 0) { return x.Length.CompareTo(y.Length); } else if (x.Height.CompareTo(y.Height) != 0) { return x.Height.CompareTo(y.Height); } else if (x.Width.CompareTo(y.Width) != 0) { return x.Width.CompareTo(y.Width); } else { return 0; } } } Public Class BoxLengthFirst Inherits Comparer(Of Box) ' Compares by Length, Height, and Width. Public Overrides Function Compare(ByVal x As Box, ByVal y As Box) As Integer If x.Length.CompareTo(y.Length) <> 0 Then Return x.Length.CompareTo(y.Length) ElseIf x.Height.CompareTo(y.Height) <> 0 Then Return x.Height.CompareTo(y.Height) ElseIf x.Width.CompareTo(y.Width) <> 0 Then Return x.Width.CompareTo(y.Width) Else Return 0 End If End Function End Class

Remarks

Implement this method to provide a customized sort order comparison for type T.

Notes to Implementers

Comparing null with any reference type is allowed and does not generate an exception. A null reference is considered to be less than any reference that is not null.

For information on culture-specific comparisons, see the System.Globalization namespace and Globalization and Localization.

Applies to

  • IComparable<T>
  • IComparable
  • StringComparer
  • Object
  • CultureInfo