Linq et l'opérateur d'égalité: l'expression du type 'System.Int32' ne peut pas être utilisée pour le paramètre de type 'System.Object'
Je suis en train de remplacer l'égalité (==) opérateur en C# pour gérer la comparaison de n'importe quel type pour un type personnalisé (le type personnalisé est vraiment un wrapper/box autour de null).
J'ai donc ceci:
internal sealed class Nothing
{
public override bool Equals(object obj)
{
if (obj == null || obj is Nothing)
return true;
else
return false;
}
public static bool operator ==(object x, Nothing y)
{
if ((x == null || x is Nothing) && (y == null || y is Nothing))
return true;
return false;
}
...
}
Maintenant si je fais un appel comme:
Nothing n = new Nothing();
bool equal = (10 == n);
Il fonctionne parfaitement bien. Cependant, si j'essaie de faire la même chose à travers une expression Linq arbre:
exp = Expression.Equal(
Expression.Constant(10),
Expression.Constant(new Nothing(), typeof(Nothing))
);
Il lève l'exception:
System.ArgumentException : Expression of type 'System.Int32' cannot be used for parameter of type 'System.Object' of method 'Boolean op_Equality(System.Object, PARTSFinder.Rules.Runtime.RulesNothing)'
at System.Linq.Expressions.Expression.ValidateArgumentTypes(MethodInfo method, ReadOnlyCollection`1& arguments)
at System.Linq.Expressions.Expression.ValidateCallArgs(Expression instance, MethodInfo method, ReadOnlyCollection`1& arguments)
at System.Linq.Expressions.Expression.Call(Expression instance, MethodInfo method, IEnumerable`1 arguments)
at System.Linq.Expressions.Expression.Call(Expression instance, MethodInfo method, Expression[] arguments)
at System.Linq.Expressions.ExpressionCompiler.GenerateBinaryMethod(ILGenerator gen, BinaryExpression b, StackType ask)
Toutes les idées sur pourquoi le système de base peut convertir Int32 à l'Objet, mais Linq ne peut pas, ou comment je peux résoudre ce problème?
Ce tout regardé parce que Linq ne peut pas comparer Int32 pour Objet, en premier lieu:
exp = Expression.Equal(
Expression.Constant(10),
Expression.Constant(null)
);
Déclenche une exception indiquant qu'il n'y a pas d'opérateur de comparaison "du Système.Int32" et "le Système de.L'objet".
Rapide suivi:
La suite de faire un travail sans problème:
exp = Expression.Equal(
Expression.Constant(10, typeof(object)),
Expression.Constant(new Nothing(), typeof(Nothing))
);
exp = Expression.Equal(
Expression.Constant(10, typeof(object)),
Expression.Constant(null)
);
Donc spécifiquement coulée de tout objet. Donc ne Linq tout simplement pas l'héritage de la poignée à l'interne? C'est assez gênant...
De suivi n ° 2:
J'ai aussi essayé en utilisant une mesure méthode de comparaison:
exp = Expression.Equal(
Expression.Constant(10),
Expression.Constant(null),
false,
this.GetType().GetMethod("ValueEquals", BindingFlags.Public | BindingFlags.Static)
);
public static bool ValueEquals(object x, object y)
{
if (x == null && y == null)
return true;
if (x.GetType() != y.GetType())
return false;
return x == y;
}
Ce trop déclenche une exception:
System.InvalidOperationException : The operands for operator 'Equal' do not match the parameters of method 'ValueEquals'.
at System.Linq.Expressions.Expression.GetMethodBasedBinaryOperator(ExpressionType binaryType, Expression left, Expression right, MethodInfo method, Boolean liftToNull)
Mais de nouveau casting tout directement à l'objet de travaux:
exp = Expression.Equal(
Expression.Constant(10, typeof(object)),
Expression.Constant(null, typeof(object)),
false,
this.GetType().GetMethod("ValueEquals", BindingFlags.Public | BindingFlags.Static)
);
Donc je suppose que j'ai ma solution... exprimés tout à l'objet et à l'utilisation d'une comparaison personnalisée de la méthode. Je suis toujours surpris de Linq n'est pas de faire la conversion automatiquement comme normal C#.
source d'informationauteur CodingWithSpike
Vous devez vous connecter pour publier un commentaire.
Quel est le problème avec null? Re le manque
int
vsnull
essayezint?
:Vous devriez jeter un oeil à cet article pour vérifier un type nullable.
http://msdn.microsoft.com/en-us/library/ms366789.aspx