私は .NET Reflector を調べていて、たとえば "String" のような参照型の場合、"==" 演算子の明示的なオーバーロードがあることに気付きました。
typeof(string).GetMethod("op_Equality", BindingFlags.Static | BindingFlags.Public)
戻り値: "==" 演算子の System.Reflection.MethodInfo。
その実装により、次のようなことはできません。
if("hi" == 3) // compiler error, plus code would throw an exception even if it ran)
ただし、同じことが値型に対しても機能します。
if((int)1 == (float)1.0) // correctly returns true
if((int)1 == (float)1.2) // correctly returns false
.NET が型変換プロセスを内部で処理する方法を正確に把握しようとしているので、.NET Reflector で op_Equality() の実装を探していましたが、「int」にはありません。
typeof(int).GetMethod("op_Equality", BindingFlags.Static | BindingFlags.Public)
null を返します。
では、値型の「==」演算子のデフォルトの実装はどこにあるのでしょうか? リフレクションを介して呼び出すことができるようにしたい:
public bool AreEqual(object x, object y)
{
if(x.GetType().IsValueType && y.GetType().IsValueType)
return x == y; // Incorrect, this calls the "object" equality override
else
...
}
編集#1:
私はこれを試しましたが、うまくいきませんでした:
(int)1 == (float)1; // returns true
System.ValueType.Equals( (int)1, (float)1 ); // returns false
編集#2:
これも試しましたが、愛はありません:
object x = (int)1;
object y = (float)1.0;
bool b1 = (x == y); // b1 = false
bool b2 = ((ValueType)x).Equals(y); // b2 = false
ValueType のこの .Equals 演算子は、この型チェック (.NET Reflector から取得) により機能しないと考えています。
ValueType.Equals(object obj)
{
...
RuntimeType type = (RuntimeType) base.GetType();
RuntimeType type2 = (RuntimeType) obj.GetType();
if (type2 != type)
{
return false;
}
...