假设您将dynamic
变量视为int(值小于int.MaxValue
)。
在您的应用程序中的某个时刻,动态值会增加并超过“int”值。
应用程序是否会崩溃或将其(转换)视为long
?
答案 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。