2009-08-27 109 views
11

什麼是類型轉換,這有什麼用?它是如何工作的?在C中進行類型轉換#

請提供樣例教程,我找不到任何搜索Google的好程序。

+2

哈哈哈..真是個笑話!!! – MAC

+0

我可以告訴你知道如何制定你的問題,親愛的! –

+0

[http://en.wikipedia.org/wiki/Type_conversion](http://en.wikipedia.org/wiki/Type_conversion) – Raghav

回答

50

鑄造通常是告訴,雖然它只是知道一個值是一些通用型的編譯器的問題,你知道這是實際上是一個更具體的類型的。例如:

object x = "hello"; 

... 

// I know that x really refers to a string 
string y = (string) x; 

有各種轉換運算符。所述(typename) expression形式可以做三件不同的事情:

  • 取消裝箱轉換(例如,從一個裝箱整數int
  • 用戶定義的轉換(例如,鑄造XAttributestring)內的
  • 引用轉換類型的層次結構(例如鑄造objectstring

所有這些可能會失敗在執行時,在這種情況下,將引發異常。

as操作者,另一方面,從不拋出異常 - 相反,該轉換的結果是null如果失敗:

object x = new object(); 
string y = x as string; // Now y is null because x isn't a string 

它可用於解包到一個空值類型:

object x = 10; // Boxed int 
float? y = x as float?; // Now y has a null value because x isn't a boxed float 

也存在隱式轉換,例如從intlong

int x = 10; 
long y = x; // Implicit conversion 

這是否涵蓋一切你感興趣的?

+1

好的答案喬恩! – UnkwnTech

+2

@jon Skeet給出了答案,它並沒有涵蓋它發生過的所有事情? – Shrivallabh

+0

閱讀[this](http://stackoverflow.com/questions/2690866/what-is-the-purpose-of-a-question-mark-after-a-type-for-example-int-myvariabl)看到'float'類型後問號的作用。 – martijnn2008

2

參見thisthis

由於C#是在編譯時靜態類型,一個變量聲明之後,它不能被再次聲明或用於另一種類型的存儲的值,除非該類型可轉換爲變量的類型

...

然而,你可能有時需要的值複製到另一種類型的變量或方法參數。例如,您可能有一個整型變量,您需要將其傳遞給參數類型爲double的方法。或者您可能需要將類變量分配給接口類型的變量。這些類型的操作稱爲類型轉換。在C#中,您可以執行以下種類的轉換

+0

來自鏈接:「但是,如果轉換不能沒有失去的風險信息,編譯器要求您執行顯式轉換,這稱爲轉換。「 這是說鑄造是一樣的顯式轉換? –

0

將數據從一種數據類型轉換爲另一種數據類型。

一般閱讀請參閱this

又見msdn

3

投射意味着創建一個對象的引用,該引用與您當前擁有的引用類型不同。你可以做向上轉換或向下轉換,每個都有不同的好處。

上溯造型:

string greeting = "Hi Bob"; 
object o = greeting; 

這產生從更具體的參考(字符串)的更一般的參考(對象)。也許你寫的代碼,可以處理任何對象,像這樣:

Console.WriteLine("Type of o is " + o.GetType()); 

這些代碼並不需要無論什麼對象設置o設置爲改變。

向下轉換:

object o = "Hi Bob"; 
string greeting = (string)o; 

在這裏,你想更具體的參考。你可能知道,對象是一個字符串(您可以測試這個例如:

if (o is string) 
{ do something } 

現在你可以把參考的字符串,而不是一個對象如字符串的長度(但對象不),這樣你就可以說:

Console.WriteLine("Length of string is " + greeting.length); 

,你不能用一個對象做

0

另外,如果你明確鑄造,可以利用模式匹配的。如果你有一個對象。 :

object aObject = "My string value"; 

你可以安全地把對象作爲一個單行的字符串:

if (aObject is string aString) 
{ 
    Console.WriteLine("aString = " + aString) 
    // Output: "aString = My string value" 
} 

用倒置if語句,你可以放心地投類型,未能早早如果需要使用此,沿

public void Conversion(object objA, object objB) 
{ 
    // Fail out early if the objects provided are not the correct type, or are null 
    if (!(objA is string str) || !(objB is int num)) { return; } 

    // Now, you have `str` and `num` that are safely cast, non-null variables 
    // all while maintaining the same scope as your Conversion method 
    Console.WriteLine("str.Length is " + str.Length); 
    Console.WriteLine("num is " + num); 
}