2

更新 1

単純なジェネリック型の元の制限により、実装されているかどうかに関係なく、さまざまな種類のオブジェクトを比較できないことがわかりIComparable<T>ました。その結果、最新のものは次のようになりました。

public static bool IsLessThan<TSource, TComparer>(this TSource source, TComparer comparer)
    where TSource : IComparable<TComparer>
    where TComparer : IComparable<TComparer>
{
    return source.CompareTo(comparer) < 0;
}

オリジナル

インターフェイスに簡単なIsLessThan(IComparable comparer)拡張メソッドを作成しました。ただしIComparable、小さな問題が発生しました。私は、基本的に、IComparable比較したくないものをすべて比較できることに気付きました。あるいは、ジェネリック型を使用してパラメーターを制限できるかどうか疑問に思っていますか? 現在、私の拡張メソッドは次のようになっています。

public static bool IsLessThan(this IComparable source, IComparable comparer) 
{
    return source.CompareTo(comparer) < 0;
}

の制約を維持しながら、ジェネリックを使用してsourceとが同じ型であることを確認する方法はありますか?comparerIComparable

int test = 2;
var resultOne = test.IsLessThan(3); // should return true
var resultTwo = test.IsLessThan("Hello world"); // shouldn't compile
4

2 に答える 2

3

さて、あなたは使うことができます:

public static bool IsLessThan<T>(this T source, T comparer) where T : IComparable

または、次を使用して、より制限することもできますIComparable<T>

public static bool IsLessThan<T>(this T source, T comparer)
    where T : IComparable<T>

後者は、ボクシングを回避するという点でもより効率的です。

于 2012-09-20T13:38:49.717 に答える
0

ここに完全なコードがあります

public static class ComparableEx
{
    public static bool IsLessThan<T>(this T source, T comparer)  
        where T : IComparable<T>
    {
        return source.CompareTo(comparer) < 0;
    }

}

class Program
{
    static void Main(string[] args)
    {
        int test = 2;
        var resultOne = test.IsLessThan(3); // returns true
        var resultTwo = test.IsLessThan("Hello world"); // doesn't compile
    }        
}

私はパーティーに遅れていることを知っていますが、それは独立した解決策です(さらに、ジョンと競争するのは非常に難しいです、ため息...)

于 2012-09-20T13:47:24.007 に答える