3

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

public class Foo<TKey>
{
   ...
}

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

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

现在我需要设置约束以确保它TKey是一个数值,以便使用按位运算符。无论如何,您不能设置约束以确保它是一个数值,因为short,int,double,...不要实现类似INumeric.

现在的问题是,这是否可能只有约束?

4

2 回答 2

1

泛型是关于允许地球上任何程序员可能为 T 投入的任何 Random 类。然而,数字类型实际上是一个非常静态的列表。我永远不会期望程序员制作自己的数字类型。包含二元运算符在内的重载运算符?也许很少。

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

  • 您必须期望带符号的 Int64 IIRC 的最高范围整数
  • 您必须期望的最高范围浮点数。IIRC,十进制*。
  • 可选的 BigInteger,当你必须期待非常大的数字时。然而,简短的观察表明,没有一个Math 类函数支持 BigInt 值。他们将其保留为 Decimal、Double 和许多更小的内置数字。因此,这种情况可能已被删除,因为它很少见且容易出错。

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

于 2019-12-17T11:59:14.580 回答
0

试试这个代码:

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

这应该工作!

于 2019-12-17T10:15:26.743 回答