【问题标题】:Generic constrain for bitwise operators按位运算符的通用约束
【发布时间】:2019-12-17 10:03:44
【问题描述】:

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

public class Foo<TKey>
{
   ...
}

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

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

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

现在的问题是,这是否可能仅在约束条件下实现?

【问题讨论】:

  • 只有很少的数字类型。更重要的是,列表是不变的。所以泛型无论如何都不是正确的工具。只需为您需要的最高 Int 和 float 类型提供 1 个函数。
  • @Christopher 听起来不错,会这样做。您可能想发布一个我可以接受的答案,以便其他人更快地找到“解决方案”。
  • 按位运算符是为intuintlongulong 类型定义的。对于其他整数类型(sbytebyteshortushortchar),它们的值将转换为int
  • 这能回答你的问题吗? Generic constraint to match numeric types

标签: c# generics constraints generic-constraints


【解决方案1】:

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

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

  • 您必须期望有符号 Int64 IIRC 的最高范围整数
  • 您所期望的最高范围浮点数。 IIRC,十进制*。
  • 可选 BigInteger,用于当您必须期待非常大的数字时。然而,简短的观察显示,Math class functions 都不支持 BigInt 值。他们将其保留为 Decimal、Double 和许多更小的内置数字。因此,这种情况可能会因为罕见且容易出错而被删除。

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

【讨论】:

    【解决方案2】:

    试试这个代码:

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

    这应该可行!

    【讨论】:

    • 嗯,是的,但这会让很多东西变得无用,我真的不想总是把它转换成Int32。无论如何,我会用它做一些测试。
    • @Twenty “我真的不想总是将其转换为 Int32” - 在这种情况下,您应该在问题中这么说!我假设您希望将返回类型转换为“TKey”?
    • @Twenty 不可能!
    • 好吧,我注意到了,我会按照@Christopher 的建议去做。无论如何谢谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-12
    相关资源
    最近更新 更多