簡體   English   中英

限制C#中的泛型類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM