按位运算符的一般约束
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 具有更大的范围。按照一个数量级,它本身也有一个数量级。
所以我有一个 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 具有更大的范围。按照一个数量级,它本身也有一个数量级。