Iは、.NETリフレクターの周り突き、例えば「文字列」のような参照型のために、「==」演算子の明示的な過負荷があることに気づいた。.NET:値の型には "==" op_Equality()のデフォルトの実装はどこにありますか?
typeof(string).GetMethod("op_Equality", BindingFlags.Static | BindingFlags.Public)
戻り値:するSystem.Reflection。 "=="演算子のMethodInfo。私はどのように正確に把握しようとしている
if((int)1 == (float)1.0) // correctly returns true
if((int)1 == (float)1.2) // correctly returns false
:
if("hi" == 3) // compiler error, plus code would throw an exception even if it ran)
しかし、同じことは、値型のために働く:
、その実装に、あなたのようなことを行うことはできません.NETは内部的に型変換プロセスを処理するので、.NET Reflectorではop_Equality()の実装を探していましたが、「int」には.NET型がありません。typeof(int).GetMethod("op_Equality", BindingFlags.Static | BindingFlags.Public)
を返します。
したがって、値型の "=="演算子のデフォルト実装はどこですか? 私はリフレクション経由で呼び出すことができるようにしたい:
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リフレクターからリッピング)このタイプのチェックには動作しません信じて:
ValueType.Equals(object obj)
{
...
RuntimeType type = (RuntimeType) base.GetType();
RuntimeType type2 = (RuntimeType) obj.GetType();
if (type2 != type)
{
return false;
}
...
これは正しい軌道に乗っています。適切なキャストが何であるべきかを伝える方法はありますか?例えば、結果をintではなくfloatにキャストする方法をどのように知っていますか?優先順位はどこかにあるはずです... – CodingWithSpike
これは正しいです。 C#(int)1 ==(float)1.0をコーディングすると、コンパイラは、(float)1.0 ==(float)1.0のIL相当を生成します。コンパイル時にintをアップキャストします。したがって、実行時に型は等しくなります。 – CodingWithSpike