簡體   English   中英

為什么(string)int32總是拋出:無法將類型'int'轉換為'string'

[英]Why does (string)int32 always throw: Cannot convert type 'int' to 'string'

為什么(string)int32總是拋出:無法將類型'int'轉換為'string'

public class Foo
    {   
        private int FooID;
        public Foo()
        {
            FooID = 4;
            string s = (string)FooID; //throws compile error
            string sss = FooID.ToString(); //no compile error
        }
    }

因為沒有從Int32到string定義的類型轉換。 這就是ToString方法的用途。

如果你這樣做:

string s = (string)70;

你期望在s?

答:“70”這個數字的編寫方式與人類閱讀它的方式相同。
B.“+ 70”前面寫有正面指示的數字。
C.“F”由ASCII碼70表示的字符
D.“\\ x00 \\ x00 \\ x00F”int的四個字節分別轉換為它們的ASCII表示。
E.“\\ x0000F”將int分成兩組,每組兩個字節,每個字節代表一個Unicode字符。
F.“1000110”的二進制表示為70。
G.“$ 70”整數轉換為貨幣
H.別的東西。

編譯器無法分辨,因此它可以讓您做到很長的路要走。

有兩個“長路”。 第一種是使用Convert.ToString()重載之一,如下所示:

string s = Convert.ToString(-70, 10);

這意味着它將使用基數10表示法將數字轉換為字符串。 如果數字為負數,則在開頭顯示“ - ”,否則只顯示數字。 但是,如果轉換為二進制,八進制或十六進制,則負數將以二進制補碼顯示,因此Convert.ToString(-7,16)變為“ffffffba”。

另一個“漫長的方法”是使用ToString和字符串格式化程序,如下所示:

string s2 = 70.ToString("D");

D是格式化程序代碼,它告訴ToString方法如何轉換為字符串。 下面列出了一些有趣的代碼:

“D”十進制格式,如果需要,為數字0-9,開頭為“ - ”。 例如-70變為“-70”。
“D8”我已經顯示了8但可能是任何數字。 與十進制相同,但它用零填充到所需的長度。 例如-70變為“-00000070”。
插入“N”千個分隔符,最后添加“.00”。 例如-1000變為“-1,000.00”。
“C”在“ - ”之后的開頭添加貨幣符號,然后它與“N”相同。 例如,使用en-Gb培養-1000變為“ - £1,000.00”。
“X”十六進制格式。 例如-70變為“46”。

注意:這些格式取決於當前的文化設置,因此如果您使用en-Us,則在使用格式代碼“C”時將獲得“$”而不是“£”。

有關格式代碼的詳細信息,請參閱MSDN - 標准數字格式字符串

當執行像(string)30這樣的強制轉換操作時,你基本上告訴計算機“這個對象與我正在投射的對象相似,我不會丟失太多(或任何)數據/功能”。

將數字轉換為字符串時,數據中存在“丟失”。 字符串不能執行數學運算,也不能執行數字相關的操作。

這就是為什么你可以這樣做:

int test1 = 34;
double test2 = (double)test1;

但不是這個:

int test1 = 34;
string test2 = (string)test1;

這個例子並不完美,因為(IIRC)這里的轉換是隱含的,但是想法是當轉換為double時,你不會丟失任何信息。 無論是double還是int該數據類型仍然可以基本上相同。 stringint不能說同樣的。

只有在轉換完成后不會丟失太多功能時,才允許(通常)進行轉換。

.ToString()方法與強制轉換不同,因為它只是一個返回string數據類型的方法。

Int沒有明確的字符串運算符。 但是,他們有Int32.ToString();. 也許你可以用擴展方法創建一個,如果你真的想。

只是另一個注意事項:一般來說,如果你想做這樣的顯式轉換(我同意這里的許多其他答案,為什么它需要顯式轉換) 不要忽略轉換類型 它專為這些原始/簡單類型轉換而設計。

我知道,當從C#開始(並且來自C ++)時,我發現自己遇到了類型轉換,看起來它們應該有效。 當涉及到這類事情時,C ++會更加自由,所以在C#中,設計師希望您知道何時類型轉換模糊或不明智。 然后,轉換類型允許您顯式轉換和理解副作用 ,從而填補空白。

因為C#不知道如何將int轉換為字符串,所以庫(.ToString)可以。

Int32無法轉換為字符串,因為C#編譯器不知道如何從一種類型轉換為另一種類型。

為什么會這樣,你會問原因是簡單的int32是類型整數/數字和字符串是,哦,好類型字符串/字符。 您可以將數字類型轉換為另一種數字類型(例如float到int,但要注意可能會丟失准確性)。 如果在編譯器中編碼的所有可能的強制轉換編譯器將變得太慢並且肯定會錯過為用戶定義的類型創建的大部分可能的強制轉換,這是主要的NO NO。

因此,解決方法是C#中的任何對象都有一個繼承.ToString()的函數,它知道如何處理每個類型,因為.ToString()是針對特定類型專門編碼的,正如您現在猜測的那樣返回一個字符串。

在所有Int32類型都是內存中的某些位(確切地說是32位)並且字符串類型是另一堆位(多少位取決於已分配了多少)后,編譯器/運行時不知道任何事情本身只是看着那個數據到現在為止。 .ToString()函數訪問從一個轉換為另一個所需的特定元數據。

我剛剛找到了答案。 ToString在int變量上工作正常。 你只需要確保添加括號。

即...

int intMyInt=32;

string strMyString = intMyInt.ToString();

VB .net完全能夠從int轉換為字符串......實際上Java也是如此。 為什么C#有問題呢? 有時需要在計算中使用數值,然后以字符串格式顯示結果。 你怎么能設法在TextBox中顯示計算結果?

這里給出的回答毫無意義。 必須有一種方法將int轉換為字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM