byte b;
int i;
unchecked
{
b = 255 + 255; //overflows
i = 100 + int.MaxValue+100; // works
}
1)內溢出錯誤是爲什麼B表達的影響(b = 255 + 255;
)導致溢出錯誤,由於受着兩個相互矛盾的規則,其中第一條規則R1狀態的原因:獲取選中聲明
A constant-expression (§7.19) of type int can be converted to type sbyte, byte, short, ushort, uint, or ulong, provided the value of the constant-expression is within the range of the destination type.
而第二個規則R2指出在未檢查的上下文中允許溢出。
,在b表達的情況下,R1優先R2,因此由於常量表達式255+ 255
不是目標類型(這是字節)的範圍內,R1導致錯誤,甚至儘管R2允許溢出?
2)
A)這是我的推理,爲什麼我的表達(i = 100 + int.MaxValue+100;
)不會導致錯誤:
1 - 當編譯器開始計算我的表達,它不會嘗試推廣值100
和int.MaxValue
執行添加之前鍵入long
(在計算過程從而這兩個值int
類型的靜止)
2 - 加入不導致溢出,但由於這種情況發生未檢查康特內XT,不會引發錯誤
3 - 由於兩個值沒有得到提升到long
,所得到的值是int
類型的也正因爲如此所得到的值是目標類型
B的範圍內)但是如果編譯器確實促進了100
和int.MaxValue
;在執行添加之前鍵入long
,那麼i表達式會因違反規則R1?造成錯誤!
感謝名單
有趣的分析 - 什麼是問題? – Hogan 2011-04-11 19:24:24
問題是我的推理是否正確:) – user702769 2011-04-11 19:41:45
除了錯誤地將規則描述爲「衝突」之外,您的分析是正確的。你爲什麼認爲這些規則有衝突?規則1並不是「優先於」另一方。這兩條規則同樣適用。 「字節b = 510;」無論上下文是選中還是未選中都是非法的。 – 2011-04-11 19:49:27