簡體   English   中英

按位運算符的通用約束

[英]Generic constrain for bitwise operators

所以我有一個看起來像這樣的類:

public class Foo<TKey>
{
   ...
}

我有一個使用TKey泛型的方法,如下所示:

public int Test(TKey val)
{
   return val | 5;
}

現在我需要設置約束以確保TKey是一個數值以便使用按位運算符。 無論如何,您不能設置約束以確保它是一個數值,因為short,int,double,...沒有實現像INumeric這樣的接口。

現在的問題是,這是否可能只存在約束?

泛型是關於允許地球上任何程序員可能為 T 投入的任何 Random 類。然而,數字類型實際上是一個非常靜態的列表。 我永遠不會期望程序員制作自己的數字類型。 帶有重載運算符的東西,包括二進制運算符? 也許很少。

所以這不是一個通用的案例。 如果您只為 2 種(可能是 3 種)類型編寫代碼,則應該涵蓋幾乎所有現有的泛型:

  • 您必須期望有符號 Int64 IIRC 的最大范圍整數
  • 您必須期望的最高范圍浮點數。 IIRC,十進制*。
  • 可選 BigInteger,用於當您必須期望非常大的數字時。 然而,簡短的觀察顯示,沒有任何Math 類函數支持 BigInt 值。 他們將其保留為小數、雙數和許多內置數字的小數。 因此,這種情況可能已被刪除,因為很少見且容易出錯。

*更正:Decimal 在 64 位時具有最高的精度和最大的尺寸,而 Double 的范圍更大。 通過數量級,它本身具有數量級。

試試這個代碼:

    public static int Test<TKey>(TKey val) where TKey : struct, IComparable
    {
        int numberValue = Convert.ToInt32(val);
        return numberValue | 5;
    }

這是應該工作!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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