0

私のコードは、私が達成したいことについて自明だと思います:

private bool Comparison<T>(T operatorOne, T operatorTwo, string operand)
    {
        switch (operand.ToLower())
        {
            case "=":
                return operatorOne.Equals(operatorTwo);
            case "<":
                return operatorOne < operatorTwo;
            case ">":
                return operatorOne > operatorTwo;
            case "contains":
                return operatorOne.ToString().Contains(operatorTwo.ToString());
            default:
                return false;
        }
    }

エラーが発生します:

Error   16  Operator '>','<' cannot be applied to operands of type 'T' and 'T'

文字列、Int、Double、chars を比較できるメソッドが必要です。注: > または < のチェックで文字列が渡される条件、または「含む」チェックで Int が送信される条件を除外します。

4

1 に答える 1

11

Comparer<T>.Default.Compare(operatorOne, operatorTwo)比較に使えます。andをT実装しない場合、例外がスローされることに注意してください。IComparableIComparable<T>Comparer<T>.Default.Compare

Tが実装されていることを確認するために、制約IComparableを追加できます。( を実装するが を実装しないwhere T: IComparableクラスは除外されます。を実装する多くのクラスも実装するため、それでも許容される場合があります。)IComparable<T> IComparableIComparable<T>IComparable

private bool Comparison<T>(T operatorOne, T operatorTwo, string operand)
    where T: IComparable
{
    switch(operand.ToLower())
    {
        case "=":
            return Comparer<T>.Default.Compare(operatorOne, operatorTwo) == 0;
        case "<":
            return Comparer<T>.Default.Compare(operatorOne, operatorTwo) < 0;
        case ">":
            return Comparer<T>.Default.Compare(operatorOne, operatorTwo) > 0;
        case "contains":
            return operatorOne.ToString().Contains(operatorTwo.ToString());
        default:
            return false;
    }
}

PS

Servyが提案したように、追加のパラメーターとして関数に渡すこともできます。IComparerどちらIComparableも実装しないタイプをカバーできるようになるIComparable<T>ためComparer<T>.Default、それらには機能しません。

また、クレジットは、提案した@TimothyShieldsComparer<T>.Defaultに送られます。

于 2014-08-22T14:29:58.833 に答える