5

基本的に私は以下を持っています:

public static bool IsBetween<T>(this T value, T a, T b)
    where T : IComparable
{
    ...
}

public static bool IsBetween<T>(this T value, T a, T b)
    where T : IComparable<T>
{
    ...
}

問題は、制約が異なっていても、同じ署名を持つメンバーを持つことができないため、これを行うことができないことです。ただし、制約がIComparableORのいずれかであると述べる方法はありませんIComparable<T>。ですから、1つを選んでそれを使う以外に、ここで何をすべきかわかりません. そして、どちらを選んだとしても、それらは別のものであり、互いに継承していないため、もう一方を失うことになります (これは理にかなっています)。

両方を使用して達成する方法があるという点で、ここで何かが欠けていますか、それともどちらかを選択する必要がありますか (おそらく汎用バージョン)?

4

2 に答える 2

8

最初の方法が一般的である理由がまったくわかりません。なぜそれだけではないのですか?

public static bool IsBetween(this IComparable value, IComparable left, IComparable right)

メソッドをジェネリックにすることでどのような価値が追加されますか?明らかに、を呼び出すと値がボックス化されるため、ボクシングのペナルティを回避することはできませんCompareTo(object)

メソッドをジェネリックにするやむを得ない理由がない限り、ジェネリックにしないでください。その後、他の方法とは異なる署名が付けられ、問題が解決されます。

于 2012-02-18T15:55:33.727 に答える
3

.NET メソッド解決のオーバーロードでは、戻り値の型とジェネリック制約が考慮されません。したがって、IComparableIComparable<T>に共通点があったとしても、それはまだ機能しません。IComparable<T>バージョンを選択するだけです。Int32、Decimal、DateTime などの標準の .NET 型は、とにかく両方のインターフェイスを実装します。

于 2012-02-18T13:02:17.933 に答える