私は汎用クラスMyClass<T>
を持っていますが、T
はのみとなるはずです。Cで汎用タイプを限定する
これは、関係演算子のメソッドが定義されている数値型とクラスのみを意味します。これはどうすればいいですか?
私は汎用クラスMyClass<T>
を持っていますが、T
はのみとなるはずです。Cで汎用タイプを限定する
これは、関係演算子のメソッドが定義されている数値型とクラスのみを意味します。これはどうすればいいですか?
オペレータを制限することはできませんが、インターフェイスに制限することはできます。したがって、>=, <=, ==
を使用する予定ですが、CompareTo, Equals
を使用することができます。
where T : IComparable<T>
このインターフェースはあなたに(など、より小さく、より大きな)リレーショナル発注するのに便利です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
where修飾子を使用してIComparableインターフェイスを実装するクラスのみにジェネリックタイプを制限することができます。
public class MyClass<K> where K : IComparable
{
....
}
(。それはまた強く、同時にGetHashCode
を上書きすることをお勧めします)提案された方法を使用すると、パフォーマンスが大幅に低下します。もしそうでなければ、提案されたものはすべて正常に動作します。
これは、C#のプリミティブなデータ型には、ここで他の人がよく要求し、要求する「数値」データ型がないため、非常に頻繁に対処する必要がある問題です。
たぶんC#2の次のリリースはそれを持っていますが、私は疑う...
:あなたが比較できるものに制限したい場合は、のようなものを行うことができます
なぜパフォーマンスが低下すると思いますか?私はあなたが数値データ型をここで言及した理由をあまり確信していません。どの数値タイプを使用したいですか? – oleksii
私たちのフレームワークでは非常に柔軟なタイプのシステムが必要なので、私は最近多くのテストを行った。異なるプリミティブデータ型の汎用配列があるとします。配列をどのように実行しますか?ジェネリックアレイの比較はどのように行いますか?ジェネリックな汎用データ型に定義された演算があるので、この配列の算術演算はどのように行いますか?これは、数値データ型の制限がある理由の1つです。たぶんこれは私の状況を説明するためのテキストが少なすぎるかもしれませんが、ここに問題を示すスレッドがたくさんあります。 – msedi
IComparableをは、Equalsメソッドを持っていないが、IEquatable –
@nathanのthats、あなたは正しいですが、 'Equals'は仮想メソッドでありますデフォルトではオブジェクト上にあるので、私はその答えにインターフェイスについて言及しませんでした。明確にするために更新されます。 –
私はそれをしましたが、エラー '演算子
rohit89