2010-03-30 123 views

回答

8

第一個是普通的鑄造,這是改變類的一個對象(更從技術上來說,這不是鑄造,但類型轉換)。 .NET確實允許一些轉換(如intlong等),但是這個特定的轉換是不允許的。我認爲這是不被允許的原因是因爲只有一小部分字符串可以實際轉換爲int,並且這樣做的規則將非常麻煩。此外,這可能無法與國際化打好關係。

第二個是方法調用,它實際上分析一個整數的字符串表示,並從中構造一個int

+0

你能給出一些理由爲什麼(int)「84」不被允許?因爲我有理由感興趣,因爲兩者都做同樣的工作,從字符串轉換爲int – 2010-03-30 09:28:22

+0

請參閱我的答案。 String類不會實現一個轉換爲Int32(或其他數據類型)的運算符。 – Webleeuw 2010-03-30 09:38:39

1

.NET框架中只允許某些原始類型轉換。 (int)「string」不是其中之一。您需要使用轉換類或包裝類

Integer.Parse("string"); 
0

轉換是專爲一個類型轉換爲另一種的目的,並且不依賴於能夠施展。

在鑄造中,您只能投相關類型之間,和int和字符串是沒有關係的。

Integer.Parse也許對你很感興趣。

Martin。

3

那是因爲Convert.ToInt32是一個方法調用接受字符串。

(int)是從一種類型到另一種明確的轉換。字符串和Int32不是明確地也不是隱式地可轉換的。

加入有關轉換: 您可以創建自己的隱性和顯性的轉換,如:

class Foo { 
    bool b = (bool)new Blah(); 

    struct Blah { 
     public static explicit operator bool(Blah b) { 
      return true; 
     } 
    } 
} 

我已經把我的例子很簡單(沒用),但它應該做點晴只有在要轉換的類或結構中存在運算符時,纔可以進行簡單的轉換。否則,您將需要使用Convert類或IConvertible接口。

0

這是因爲沒有從字符串到int的顯式轉換。 Convert類不是通過轉換而是通過轉換來實現轉換

+2

發表評論,如果你downvote請,它可以幫助每個人學習。 – 2010-03-30 09:50:46

0

轉換就像假裝一件事是另一件事。 可以成功地假裝27L == 27m,或27L == (int)27,但假裝"84"int會,如果有可能,導致3670068,不84

爲什麼?

由於"84"存儲爲兩個Unicode字符'\x0038''\x0034'和,而不是值84Convert.ToInt32("84")"84"轉換爲(int)84

鑄造4294967295U(注意,這是無符號)到int結果在-1

uint x = 4294967295U; //need to assign this to a variable as compile will error 
Console.WriteLine((int)x); //results in -1 
1
(int)"84" 

什麼你試圖有什麼所謂的顯式類型轉換。顯式轉換僅適用於定義爲兼容的類型或對象引用。請參見本爲轉換允許http://msdn.microsoft.com/en-us/library/yht2cx7b.aspx

Convert.ToInt32("84") 

這種說法本身調用執行解析就像如果它不是由框架提供的我或你會寫一個方法。它使用反射器並查看實現,上面的方法實際上是按照下面的方式實現的,所以它不僅僅是告訴編譯器,你希望通過顯式轉換將該類型視爲另一類型。

public static int ToInt32(string value) 
{ 
    if (value == null) 
    { 
     return 0; 
    } 
    return int.Parse(value, CultureInfo.CurrentCulture); 
}