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> 
{ 
    ... 
} 

を問題は、あなたがすることはできませんので、私はこれを行うことはできませんです制約が異なる場合であっても、同じ署名を持つメンバを持つ。しかし、制約がIComparableまたはIComparable<T>のいずれかであることを示す方法はありません。だから、私はちょうど1つを選んでそれと一緒に行くのではなく、ここで何をすべきか分からない。そして、私が選んだものが何であっても、彼らは分かれていて、互いに相続していない(それは意味をなさない)ので、私は他の人に負けている。

私はここで何かを見つけられませんでした。両方を使って達成する方法があるのですか、それとも1つ(おそらくジェネリック版)を選択する必要がありますか?

答えて

8

最初の方法がなぜ一般的なのかわかりません。なぜそれだけではないのですか?

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

メソッドの汎用性を増やすためには、どのような価値がありますか?明らかに、あなたはCompareTo(object)に電話をしたときに値がボクシングされるので、ボクシングのペナルティを避けることはできません。

一般的な方法を一般的にする理由がない限り、一般的にしないでください。その後、他の方法とは異なる署名があり、問題は解決されます。

+0

私はそれについて本当に考えなかった。私はジェネリック版から始めてコピーして貼り付け、すぐに変更を加えようとしたからだと思います。 –

+0

また、デフォルトでは 'IComparable 'オプションが最初に選択され、 'IComparable'オプションが2番目に選択されますか? –

+1

@ m-y:オーバーロードの解像度は*より具体的な*メソッドを選択します。どちらがより具体的であるかを判断する方法がない場合は、あいまいなエラーが発生します。 –

3

.NETメソッドの解像度オーバーロードでは、戻り値の型とジェネリック制約が考慮されていません。だからIComparableIComparable<T>に共通しているものがあっても、まだ動作しません。ちょうどIComparable<T>バージョンを選んでください。標準の.NETタイプ(Int32、Decimal、DateTimeなど)は、両方のインターフェイスを実装します。

+0

これは私が想像したものですが、ここで何かを逃していないことを確認したかったのです。私はジェネリック版に行くつもりです。私は、私のメソッドを 'IComparable'のみを実装し、両方を実装していない他のコード(あるいは単に' IComparable ')で利用できるようにしたいと考えていました。 –

関連する問題