5

我有一个通用的方法来生成最小值和最大值内的随机数。我也有一个类似的函数来生成具有相同限制的越界值。

但问题是,我需要填写不同类型的变量。一些变量是无符号的,并且最小-最大范围与它们的无符号类型相同。

当我尝试为这些变量创建越界值时,我超出了变量的限制(准确地说是 ushort)。

这是我的通用方法:

    private static U GenerateOutOfBounds<U>(U minimum, U maximum) where U : IComparable, IFormattable, IConvertible
    {
        bool b       = g.NextBoolean();
        long signCheckForMinimum = Convert.ToInt64(minimum);
        double maxpp = g.NextDouble(Convert.ToDouble(maximum), Convert.ToDouble(maximum) + g.Next());
        double minpp = g.NextDouble(Convert.ToDouble(maximum), Convert.ToDouble(maximum) + g.Next());
        if (signCheckForMinimum >= 0)
        {
            b = true;
        }

        if (b)
        {
            return (U)Convert.ChangeType(maxpp, Type.GetTypeCode(typeof(U)));
        }
        else
        {
            return (U)Convert.ChangeType(minpp, Type.GetTypeCode(typeof(U)));
        }
    }

我试图通过将其转换为 long 来确定该数字是否未签名,但我现在可以看到这种方法是非常错误的。

那么如何确定我得到的变量是否是无符号的,或者有没有办法在不与所有无符号类型进行比较的情况下检查该类型是否是无符号的?

4

2 回答 2

13
bool signed = Convert.ToBoolean(typeof(U).GetField("MinValue").GetValue(null));

有符号类型具有非零MinValue常量,它将true在布尔转换期间转换为。

于 2012-11-28T16:08:06.517 回答
0

我会通过比较 param == abs(param) 来回答这个问题,以便您可以确定它是否为负数并分别处理。您可以尝试上转换为双精度(或最大可能的有符号数字类型,以免丢失任何精度)。

于 2012-11-28T15:05:00.987 回答