按位运算符的一般约束

Generic constrain for bitwise operators

所以我有一个 class 看起来像这样:

public class Foo<TKey>
{
   ...
}

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

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

现在我需要设置约束以确保 TKey 是一个数值,以便使用按位运算符。无论如何你不能设置约束来确保它是一个数值,因为 short,int,double,... 没有实现像 INumeric 这样的接口。

现在的问题是,仅在限制条件下这是否可能?

试试这个代码:

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

这应该行得通!

泛型是关于允许这个星球上的任何程序员可能为 T 投入的任何随机 class。然而,数字类型实际上是一个非常静态的列表。我永远不会指望程序员会创建自己的数字类型。包含二进制运算符在内的超载运算符?也许很少。

所以这不是一个普遍的案例。如果您只为 2 种(也许是 3 种)类型编写代码,那么您应该涵盖几乎所有现存的泛型:

  • 您必须期望的最大范围整数有符号 Int64 IIRC
  • 您必须期望的最高范围浮点数。 IIRC,十进制*。
  • 可选 BigInteger,用于当您必须期待非常大的数字时。然而,简短的观察表明 Math class functions 中的 none 支持 BigInt 值。他们将其保留为 Decimal、Double 和许多内置于 Numerics 中的较小值。所以这个案例可能已经被放弃了,因为它很少见并且很容易出错。

*更正:虽然 Decimal 在 64 位具有最高的精度位数和最大的大小,但 Double 具有更大的范围。按照一个数量级,它本身也有一个数量级。