2011-07-31 16 views
9

私は汎用クラスMyClass<T>を持っていますが、Tのみとなるはずです。Cで汎用タイプを限定する

これは、関係演算子のメソッドが定義されている数値型とクラスのみを意味します。これはどうすればいいですか?

答えて

10

オペレータを制限することはできませんが、インターフェイスに制限することはできます。したがって、>=, <=, ==を使用する予定ですが、CompareTo, Equalsを使用することができます。

where T : IComparable<T> 

Interface documentation

このインターフェースはあなたに(など、より小さく、より大きな)リレーショナル発注するのに便利ですCompareTo方法をもたらします。プリミティブと文字列はこれを実装していますが、独自のカスタム型用にこれを実装する必要があります。あなたはobject上の仮想メソッドとしてデフォルトで取得この

void SomeMethod<T>(T alpha, T beta) where T : IComparable<T> 
{ 
    if (alpha.CompareTo(beta) > 0) 
    { 
     // alpha is greater than beta, replaces alpha > beta 
    } 
    else if (alpha.CompareTo(beta) < 0) 
    { 
     // alpha is less than beta, replaces alpha < beta 
    } 
    else 
    { 
     // CompareTo returns 0, alpha equals beta 
    } 
} 

Equalsのようにそれを使用します。参照等価以外のものを使用する場合は、独自のカスタム型でこのメソッドをオーバーライドする必要があります。速度は関連性がある場合

public class MyClass<T> where T:IComparable 
+0

IComparableをは、Equalsメソッドを持っていないが、IEquatable –

+0

@nathanのthats、あなたは正しいですが、 'Equals'は仮想メソッドでありますデフォルトではオブジェクト上にあるので、私はその答えにインターフェイスについて言及しませんでした。明確にするために更新されます。 –

+0

私はそれをしましたが、エラー '演算子 rohit89

3

where修飾子を使用してIComparableインターフェイスを実装するクラスのみにジェネリックタイプを制限することができます。

public class MyClass<K> where K : IComparable 
{ 
    .... 
} 
3

(。それはまた強く、同時にGetHashCodeを上書きすることをお勧めします)提案された方法を使用すると、パフォーマンスが大幅に低下します。もしそうでなければ、提案されたものはすべて正常に動作します。

これは、C#のプリミティブなデータ型には、ここで他の人がよく要求し、要求する「数値」データ型がないため、非常に頻繁に対処する必要がある問題です。

たぶんC#2の次のリリースはそれを持っていますが、私は疑う...

-1

:あなたが比較できるものに制限したい場合は、のようなものを行うことができます

+0

なぜパフォーマンスが低下すると思いますか?私はあなたが数値データ型をここで言及した理由をあまり確信していません。どの数値タイプを使用したいですか? – oleksii

+0

私たちのフレームワークでは非常に柔軟なタイプのシステムが必要なので、私は最近多くのテストを行った。異なるプリミティブデータ型の汎用配列があるとします。配列をどのように実行しますか?ジェネリックアレイの比較はどのように行いますか?ジェネリックな汎用データ型に定義された演算があるので、この配列の算術演算はどのように行いますか?これは、数値データ型の制限がある理由の1つです。たぶんこれは私の状況を説明するためのテキストが少なすぎるかもしれませんが、ここに問題を示すスレッドがたくさんあります。 – msedi

関連する問題