如何确定通用数字参数是否未签名?

时间:2012-11-28 14:22:09

标签: c# generics random

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

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

当我尝试为这些变量创建越界值时,我超出了变量的限制(确切地说是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,但我现在可以看到该方法非常为false。

那么如何确定我得到的变量是无符号的还是有没有办法检查类型是否是无符号的而不与所有无符号类型进行比较?

2 个答案:

答案 0 :(得分:9)

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

带符号的类型具有非零MinValue常量,在布尔强制转换期间将转换为true

答案 1 :(得分:0)

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