1

我有一个方法:

public void StoreNumberInSmallestType(ValueType number)
{
    if (numberTypes == null)
        numberTypes = new List<Type>() { typeof(sbyte), typeof(short), typeof(int), typeof(long), typeof(float), typeof(double) };

    foreach (Type t in numberTypes)
    {
        try
        {
            var converter = TypeDescriptor.GetConverter(t);
            value = converter.ConvertTo(number, t);

            Type = value.GetType();

            return;
        }

        catch (OverflowException) { }
    }
}

该方法位于变量value定义为的类中dynamic

像这样使用时:

StoreNumberInSmallestType(Math.Pow(200, 100));

value最终成为Infinity. 如果我单步执行这个过程,我会发现 的值number不是Infinity,而是用科学计数法表示的结果。number每当被转换并存储在里面时,就会发生一些不好的事情value。有谁知道为什么number持有正确的价值,但value不知道?

编辑:

这是一个完整的代码示例:

主要的:

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Class1 c1 = new Class1();
            c1.StoreNumberInSmallestType(Math.Pow(200, 100));
        }
    }
}

班级:

namespace ConsoleApplication1
{
    public class Class1
    {
        List<Type> numberTypes;
        dynamic value;
        public Type Type { get; set; }

        public void StoreNumberInSmallestType(ValueType number)
        {
            if (numberTypes == null)
                numberTypes = new List<Type>() { typeof(sbyte), typeof(short), typeof(int), typeof(long), typeof(float), typeof(double) };

            foreach (Type t in numberTypes)
            {
                try
                {
                    var converter = TypeDescriptor.GetConverter(t);
                    value = converter.ConvertTo(number, t);

                    Type = value.GetType();

                    return;
                }

                catch (OverflowException) { }
            }
        }
    }
}
4

3 回答 3

2

当您使用 Single Type 对您的号码进行转换时会发生这种情况,该单类型的最大值为3.40282347E+38且 nber 的值是,1.2676506002282294E+230因此您超出了值类型。一旦你把它变成双重类型,它就会1.2676506002282294E+230有价值。

从上面的链接:

如果浮点运算结果的幅度对于目标格式来说太大,则运算结果为 PositiveInfinity 或 NegativeInfinity,这与结果的符号相适应。

于 2012-07-01T05:39:08.907 回答
1

双转换不是无穷大,而是浮点转换。
在那里你得到 Infinity 并且没有例外,然后你的代码在你进行双重转换之前返回。

于 2012-07-01T05:39:53.207 回答
0

溢出条件导致无穷大;您可以使用以下任一方法进行检查:

浮点转换导致您超出数据类型的限制。

于 2012-07-01T05:42:57.667 回答