private static BinaryExpression GetEqualityComparisonOperator(ExpressionType binaryType, string opName, Expression left, Expression right, bool liftToNull)
{
// known comparison - numeric types, bools, object, enums
if (left.Type == right.Type && (left.Type.IsNumeric() ||
left.Type == typeof(object) ||
left.Type.IsBool() ||
left.Type.GetNonNullableType().GetTypeInfo().IsEnum))
{
if (left.Type.IsNullableType() && liftToNull)
{
return new SimpleBinaryExpression(binaryType, left, right, typeof(bool?));
}
else
{
return new LogicalBinaryExpression(binaryType, left, right);
}
}
// look for user defined operator
BinaryExpression b = GetUserDefinedBinaryOperator(binaryType, opName, left, right, liftToNull);
if (b != null)
{
return b;
}
if (TypeUtils.HasBuiltInEqualityOperator(left.Type, right.Type) || IsNullComparison(left, right))
{
if (left.Type.IsNullableType() && liftToNull)
{
return new SimpleBinaryExpression(binaryType, left, right, typeof(bool?));
}
else
{
return new LogicalBinaryExpression(binaryType, left, right);
}
}
throw Error.BinaryOperatorNotDefined(binaryType, left.Type, right.Type);
}