C# 使用IComparable接口比较int和long

C# 使用IComparable接口比较int和long,c#,icomparable,C#,Icomparable,我希望有比较两个对象并通过以下测试的表达式类 public abstract class ComparisonExpression { public bool Evaluate(IComparable left, object right) { if (left == null && right == null) return true; if (left == null || right == null)

我希望有比较两个对象并通过以下测试的表达式类

public abstract class ComparisonExpression
{
    public bool Evaluate(IComparable left, object right)
    {
        if (left == null && right == null)
            return true;

        if (left == null || right == null)
            return false;

        return GetResult(left.CompareTo(right));
    }

    protected abstract bool GetResult(int comparisonResult);
}

public class AreEqualExpression : ComparisonExpression
{
    protected override bool GetResult(int comparisonResult)
    {
        return comparisonResult == 0;
    }
}

// TEST

const int i = 123;
const long l = 123L;
const string s = "123";

Assert.IsTrue(new AreEqualExpression().Evaluate(i, l));
Assert.IsFalse(new AreEqualExpression().Evaluate(i, s));
Assert.IsFalse(new AreEqualExpression().Evaluate(l, s));
IComparable实现似乎希望给定类型与当前类型匹配。我遇到了一个异常,比如对象必须是Int32类型

我认为如果类型不相等,则返回false。它阻止了异常,但阻止了我想要的行为

我还考虑过类型转换,但这次字符串和int比较将返回true,这是我不想要的


有什么建议吗?

如果您定义此帮助器类

public static class NumericalHelper {
    public static double AsDouble(this object value, out bool success) {
        if (value is sbyte || value is byte || value is short || value is ushort || value is int || value is uint || value is long || value is decimal || value is ulong || value is float || value is double || value.GetType().IsEnum) {
            success = true;
            return Convert.ToDouble(value);
        }
        success = false;
        return 0;
    }
}
您可以这样进行比较:

public bool Evaluate(IComparable left, object right) {
    if (left == null && right == null)
        return true;

    if (left == null || right == null)
        return false;

    bool isNumerical;
    double leftValue = left.AsDouble(out isNumerical);
    double rightValue = isNumerical ? right.AsDouble(out isNumerical) : 0;

    if (isNumerical)
        return GetResult(Comparer<Double>.Default.Compare(leftValue, rightValue));
    else {
        if (left.GetType() == right.GetType())
            return GetResult(left.CompareTo(right));
        else
            return false;
}

但请注意,等式通常与Equals方法或IEquatable接口进行比较,而在您的示例中根本没有考虑到这一点。这对我来说似乎是一个问题,它不适合当前的类设计。

只是为了检查我是否理解正确:您希望比较器像往常一样进行比较,除非两种类型都是数字。在这种情况下,您希望比较器检查这些数字是否具有相同的值。如果这正是您所要求的:这是否仅适用于整数类型byte,short。。。还是小数和浮点数?不,这应该处理实现IComparable的任何类型。我的解决方案是在比较之前检查两个值是否都是数字。如果是这样,那么我将这两个值转换为十进制,然后进行比较。但对于双人和浮动车来说,这仍然是一辆马车。这就是我所理解的。所以,粗略地说,你的算法应该做到以下几点?a如果两者都是浮点数,则双击->使用浮点数进行比较b如果两者都是整数值short、int、long、…->比较整数值c,否则按常规进行比较。对吗?