2012-09-15 51 views
1

從C#類型轉換表(http://msdn.microsoft.com/en-us/library/08h86h00.aspx):「縮小轉換也可能導致丟失但是,如果正在轉換的類型的值落在目標類型的MaxValue和MinValue字段指定的範圍之外,則會引發OverflowException,並且運行時會檢查轉換以確保該值的目標類型不超過其MaxValue或MinValue。「c#縮小轉換不會產生異常

所以我期待下面的代碼生成異常:

static void Main() { 
    int numb1 = 333333333; 
    short numb2 = (short)numb1; 

    Console.WriteLine("Value of numb1 is {0}", numb1); 
    Console.WriteLine("Type of numb1 is {0}", numb1.GetType()); 
    Console.WriteLine("MinValue of int is {0}", int.MinValue); 
    Console.WriteLine("MaxValue of int is {0}\n", int.MaxValue); 

    Console.WriteLine("Value of numb2 is {0}", numb2); 
    Console.WriteLine("Type of numb2 is {0}", numb2.GetType()); 
    Console.WriteLine("MinValue of short is {0}", short.MinValue); 
    Console.WriteLine("MaxValue of short is {0}", short.MaxValue); 

    Console.ReadKey(); 
} 

而是numb2得到的17237.值,我不知道這個值來自我真的不明白爲什麼沒有產生溢出異常。

任何建議,高度讚賞!謝謝。

回答

5

默認情況下不會檢查數字轉換。您可以強制該用checked塊:

checked { short s = (short)numb1; } 

或者您可以使用Convert類不檢查的轉換:

short s = Convert.ToInt16(numb1); 

還有一個checked compiler option

值17237僅僅是333333333的較低16位(即333333333截短以適合短):

int s = numb1 & 0x0000FFFF; 
2

縮小轉換通常是在運行時用C#完成的。鑄造是使用explicit運算符,它告訴編譯器,您知道要轉換的內容,並且不希望發生任何異常或編譯錯誤。通過例外進行的縮小轉化通常是通過轉換方法調用的那些轉換方法,如Convert.ToUInt16(int) - 如果通過int大於65535,那麼OverflowException