繁体   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