je farfouillé dans le réflecteur .NET, et a remarqué que pour les types de référence comme par exemple « String », il y a une surcharge explicite de l'opérateur « == »:.NET: Où est l'implémentation par défaut pour "==" op_Equality() pour les types de valeur?
typeof(string).GetMethod("op_Equality", BindingFlags.Static | BindingFlags.Public)
retours: System.Reflection. MethodInfo pour l'opérateur "==".
En raison de sa mise en œuvre, vous ne pouvez pas faire des choses comme:
if("hi" == 3) // compiler error, plus code would throw an exception even if it ran)
Cependant, la même chose fonctionne pour les types de valeur:
if((int)1 == (float)1.0) // correctly returns true
if((int)1 == (float)1.2) // correctly returns false
Je suis en train de comprendre exactement comment .NET gère en interne le processus de conversion de type, donc je cherchais l'implémentation de op_Equality() dans .NET Reflector, mais "int" n'en a pas.
typeof(int).GetMethod("op_Equality", BindingFlags.Static | BindingFlags.Public)
renvoie la valeur null. Alors, où est l'implémentation par défaut de l'opérateur "==" pour les types de valeur? Je voudrais pouvoir appeler via la réflexion:
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
...
}
Edit # 1:
J'ai essayé, mais ça n'a pas marché:
(int)1 == (float)1; // returns true
System.ValueType.Equals((int)1, (float)1); // returns false
Édition 2:
Également t ried, mais pas d'amour:
object x = (int)1;
object y = (float)1.0;
bool b1 = (x == y); // b1 = false
bool b2 = ((ValueType)x).Equals(y); // b2 = false
Je beleive cet opérateur Equals sur ValueType ne fonctionne pas en raison de cette vérification de type (arraché à réflecteur .NET):
ValueType.Equals(object obj)
{
...
RuntimeType type = (RuntimeType) base.GetType();
RuntimeType type2 = (RuntimeType) obj.GetType();
if (type2 != type)
{
return false;
}
...
C'est sur la bonne voie. Y a-t-il un moyen de dire quelle devrait être la distribution appropriée? Par exemple, comment sait-il que le résultat est float au lieu de int? il doit y avoir un ordre de préséance quelque part ... – CodingWithSpike
C'est correct. Si vous codez C# (int) 1 == (float) 1.0; Le compilateur va générer l'équivalent en IL de (float) 1.0 == (float) 1.0; Il met à jour l'int à la compilation, donc à l'exécution, les types sont égaux. – CodingWithSpike