[英]Limiting generic types in C#
我有一個泛型類MyClass<T>
,其中T
應該只是那些可以比較的類型。
這將僅表示已定義關系運算符的方法的數字類型和類。 我該怎么做呢 ?
您不能限制運算符,但可以約束接口。 因此,打算使用>=, <=, ==
,但你可以使用CompareTo, Equals
。
where T : IComparable<T>
此接口為您提供CompareTo
方法,該方法對於關系排序(大於,小於等)非常有用。 基元和字符串已實現此功能,但您需要為自己的自定義類型實現此功能。 你會像這樣使用它
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
object
虛擬方法。 如果要使用除引用相等之外的其他內容,則希望在自己的自定義類型上覆蓋此方法。 (強烈建議同時覆蓋GetHashCode
。)
您可以將泛型類型限制為僅使用where修飾符實現IComparable接口的類。
public class MyClass<K> where K : IComparable
{
....
}
如果您想將其限制為可以比較的內容,您可以執行以下操作:
public class MyClass<T> where T:IComparable
如果速度與使用建議的方法相關將會給您帶來巨大的性能損失。 如果沒有,所有建議的事情都可以正常工作。
這是我必須經常解決的問題,因為C#中的原始數據類型沒有像其他人經常建議和要求的“數字”數據類型。
也許C#的下一個版本會有它,但我懷疑......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.