2015-11-27 42 views
15

考慮以下代碼:C#如何知道文字是什麼類型?

double i = 0xF0000000; 
Console.WriteLine(0xF0000000.GetType()); 
Console.WriteLine(i.GetType()); 

爲什麼C#打印System.UInt32的第一個和System.Double的第二個?

這是因爲,編譯器默認推斷文字類型爲var

+53

沒有'var'類型。 –

回答

57

在這一行:

double i = 0xF0000000; 

字面uint類型,但它是被隱式轉換爲double。當您撥打i.GetType()總是打印System.Double,因爲變量的類型是double ... 只有它可以容納的一種價值是double

請注意,如果您以longulong開頭,則此轉換爲double意味着您可能會失去精度。例如:

using System; 

public class Program 
{ 
    static void Main() 
    { 
     long x = 123456789; 
     double y = 123456789; 
     Console.WriteLine(x.ToString("n")); 
     Console.WriteLine(y.ToString("n")); 
    } 
} 

打印

123,456,789,012,345,678.00 
123,456,789,012,346,000.00 

注意最後的幾個數字是如何迷失在double,因爲從longdouble隱式轉換可能會失去精度。 (兩者都有64位可用,但只在double其中的一些位用於尾數。)

它不是爲intuint文字的問題,但它是值得的注意,轉換正在發生。

12

根據Integer Literals (C#)整數文字的類型取決於該值及其後綴。

  • 如果文字沒有後綴,它具有第一這些類型的,其中它的值可被表示的:整數,UINT,長,ULONG。
  • 如果文字後綴爲U或u,則它具有第一個可以表示其值的類型:uint,ulong。
  • 如果文字後綴爲L或l,則它具有第一個可以表示值的類型:long,ulong。
  • 如果文字後綴爲UL,UL,UL,UL,LU,Lu,IU或LU,則它是ulong類型。

0xF0000000沒有後綴,所以它有第一類型可以表示它(INT,UINT,長,ULONG)

  • INT是32位帶符號:0xF0000000只是外面它的正值範圍 - 下一個...
  • uint是32位無符號:0xF0000000是在它的範圍內 - 確定。

所以0xF0000000有類型uint。

decimal x = 0xF00000000; 

這裏x是一個十進制變量。當你給它分配一個uint值時,該值被隱含地轉換成一個小數(所以它將適合於十進制變量)。