2

2 つのオブジェクトを比較し、以下のテストに合格する式クラスが必要です。

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 を返すと思いました。それは例外を防ぎますが、私が望む動作を妨げます。

また、型変換も考えましたが、今度は string と int の比較で true が返されます。これは望ましくありません。

助言がありますか?

4

1 に答える 1