我无法理解这个错误:
在此对方法 SetVolume 的调用中,Volume = 2055786000 和size = 93552000。如您所见,Volume 是一个 Integer 属性,并且 size 也是 Integer。
该类是 dbml 实体类的部分类,但是此 Volume 属性不是数据库中的列,它仅作为“业务对象属性”存在于部分类中。
查看详情显示:
Data > Item:为了评估索引属性,必须限定属性并且参数必须由用户显式提供。
这可能是什么原因……?
我无法理解这个错误:
在此对方法 SetVolume 的调用中,Volume = 2055786000 和size = 93552000。如您所见,Volume 是一个 Integer 属性,并且 size 也是 Integer。
该类是 dbml 实体类的部分类,但是此 Volume 属性不是数据库中的列,它仅作为“业务对象属性”存在于部分类中。
查看详情显示:
Data > Item:为了评估索引属性,必须限定属性并且参数必须由用户显式提供。
这可能是什么原因……?
整数(有符号)的最大值是2147483647
。如果该值溢出,则会引发异常以防止程序出现意外行为。
如果不抛出该异常,则您的 值-2145629296
将为您的Volume
,这很可能是不想要的。
解决方案:Int64
为您的音量使用一个。最大值为 时9223372036854775807
,您可能更安全。
int.MaxValue = 2147483647
2055786000 + 93552000 = 2149338000 > int.MaxValue
因此,您不能将此数字存储为整数。您可以使用Int64类型,其最大值为9,223,372,036,854,775,807
.
为简单起见,我将使用字节:
byte a=250;
byte b=8;
byte c=a+b;
如果 a、b 和 c 是“int”,您会期望 258,但在“byte”的情况下,预期结果将是 2(258 和 0xFF),但在 Windows 应用程序中,您会得到一个异常,在控制台你可能不会(我没有,但这可能取决于 IDE,我使用 SharpDevelop)。
然而,有时需要这种行为(例如,您只关心结果的低 8 位)。
您可以执行以下操作:
byte a=250;
byte b=8;
byte c=(byte)((int)a + (int)b);
这样 'a' 和 'b' 都被转换为 'int',相加,然后再转换回 'byte'。
为了安全起见,您可能还想尝试:
...
byte c=(byte)(((int)a + (int)b) & 0xFF);
或者,如果您真的想要这种行为,那么执行上述操作的更简单的方法是:
unchecked
{
byte a=250;
byte b=8;
byte c=a+b;
}
或者先声明你的变量,然后在“未检查”部分进行数学运算。
或者,如果您想强制检查溢出,请改用“checked”。
希望这可以解决问题。
努尔赤
附言
相信我,那个例外是你的朋友:)
结果整数值超出了整数数据类型可以容纳的范围。
尝试使用 Int64
fo int 的最大值是 2147483647,所以 2055786000+93552000 > 2147483647 会导致溢出
2055786000 + 93552000 = 2149338000,大于 2^31。因此,如果您使用 4 字节编码的有符号整数,则操作结果不合适,并且您会得到溢出异常。
int 的最大大小为 2147483647。您可以使用更大的 Int64/Long。