T=文字列を考えてみましょう。
それが次のようなものを使用しているかどうか知りたいです:typeof(EqualityComparer<T>).GetInterface("IEqualityComparer<T>");
助言がありますか..
T=文字列を考えてみましょう。
それが次のようなものを使用しているかどうか知りたいです:typeof(EqualityComparer<T>).GetInterface("IEqualityComparer<T>");
助言がありますか..
リフレクターの礼儀:
public static EqualityComparer<T> Default
{
get
{
EqualityComparer<T> defaultComparer = EqualityComparer<T>.defaultComparer;
if (defaultComparer == null)
{
defaultComparer = EqualityComparer<T>.CreateComparer();
EqualityComparer<T>.defaultComparer = defaultComparer;
}
return defaultComparer;
}
}
private static EqualityComparer<T> CreateComparer()
{
RuntimeType c = (RuntimeType) typeof(T);
if (c == typeof(byte))
{
return (EqualityComparer<T>) new ByteEqualityComparer();
}
if (typeof(IEquatable<T>).IsAssignableFrom(c))
{
return (EqualityComparer<T>) RuntimeTypeHandle.CreateInstanceForAnotherGenericParameter((RuntimeType) typeof(GenericEqualityComparer<int>), c);
}
if (c.IsGenericType && (c.GetGenericTypeDefinition() == typeof(Nullable<>)))
{
RuntimeType type2 = (RuntimeType) c.GetGenericArguments()[0];
if (typeof(IEquatable<>).MakeGenericType(new Type[] { type2 }).IsAssignableFrom(type2))
{
return (EqualityComparer<T>) RuntimeTypeHandle.CreateInstanceForAnotherGenericParameter((RuntimeType) typeof(NullableEqualityComparer<int>), type2);
}
}
if (c.IsEnum && (Enum.GetUnderlyingType(c) == typeof(int)))
{
return (EqualityComparer<T>) RuntimeTypeHandle.CreateInstanceForAnotherGenericParameter((RuntimeType) typeof(EnumEqualityComparer<int>), c);
}
return new ObjectEqualityComparer<T>();
}
したがって、T = stringであるかどうかを確認できるように、はを返しGenericEqualityComparer<string>
ます。
EqualityComparer<T>.Default
によって定義されていvirtual
ますが、によってオーバーライドされる場合とされない場合があります。Equals(object)
GetHashCode()
System.Object
T
virtual
メソッドはであるため、より派生したクラスの実装が使用される可能性があることに注意してくださいT
。例えば:
EqualityComparer<object>.Default
.Equals(new Uri("http://example.com/"), new Uri("http://example.com/"))
true
場合でも返品します
Object.ReferenceEquals(new Uri("http://example.com/"), new Uri("http://example.com/"))
と
(object)new Uri("http://example.com/") == (object)new Uri("http://example.com/")
どちらも戻りfalse
ます。
T
isの場合string
、クラスSystem.String
は問題の 2 つのメソッドをオーバーロードし、序数比較を使用します。したがって、この場合は と同等である必要がありますSystem.StringComparer.Ordinal
。もちろんstring
はsealed
クラスなので、他のクラスから派生しstring
たり、オーバーライドEquals
したりGetHashCode
、奇妙な方法で行うことはできません。