可以将动态变量视为“int”溢出吗?

时间:2011-02-22 21:30:07

标签: c# c#-4.0

假设您将dynamic变量视为int(值小于int.MaxValue)。

在您的应用程序中的某个时刻,动态值会增加并超过“int”值。

应用程序是否会崩溃或将其(转换)视为long

5 个答案:

答案 0 :(得分:8)

  

假设您将动态变量视为int(值小于int.MaxValue)。

通过“被视为int”我假设你的意思是“包含运行时类型int的值”。

  

在您的应用程序中的某个时刻,动态值会增加并超过“int”值。

行。怎么样?您省略了问题中最重要的部分。 价值是如何增加的?

  

应用程序会崩溃或将其(转换)视为一个长的吗?

有时它会崩溃,有时结果会很长,有时候结果会是双倍的,或者是十进制的,有时候int会缠绕。既然你还没有说过如何提高价值,就无法回答你的问题了。

通常,动态规则是动态代码将在运行时运行,因为如果编译时类型已知,则等效的非动态代码将表现出来。如果编译器会给出错误,那么运行时会给出错误。如果编译器会添加两个int来生成第三个,那么运行时将添加两个int以生成第三个。如果编译器会添加一个int和一个double来生成一个double,那么运行时将添加一个int和一个double来生成一个double。等等。

答案 1 :(得分:7)

LINQPad中轻松测试:

void Main()
{
    dynamic i = int.MaxValue - 10;
    i += 15;
    Console.WriteLine(i.GetType());
    Console.WriteLine(i);
}

输出:

typeof (Int32) 
-2147483644

答案 2 :(得分:3)

取决于inc值的Type

    static void Main(string[] args)
    {
        dynamic i = int.MaxValue;
        long l = 15;
        i += l;

        Console.WriteLine(i.GetType());
        Console.WriteLine(i);

        Console.ReadLine();

    }

在我的情况下,数据类型很长,而不再像在Lasse的样本中那样是int。 (危险游戏)

输出:

System.Int64
2147483662

答案 3 :(得分:2)

  

在您的应用程序中的某个时刻,动态值会增加并超过“int”值。

int值是不可变的,不能增加。如果为类型为dynamic的变量分配了另一个值,那么该变量的运行时类型将是赋值的类型。

如果要添加两个整数,则结果将是另一个int。如果要添加int和long,则结果将很长。这是因为运行时编译器选择的operator +方法的返回类型。

此外,如果您在未经检查的上下文中添加两个整数,则溢出不会使程序崩溃。

答案 4 :(得分:0)

我已使用此代码对其进行了测试:

        dynamic a = 0;
        a = Int32.MaxValue;

        // a is now = Int32.MaxValue

        a += Int32.MaxValue;

        // a is now = -2

它没有崩溃。报告的GetType是a Int32。