簡體   English   中英

為什么C#沒有為char定義加法運算?

[英]Why does C# not define an addition operation for char's?

如標題所示。 與這個問題有關。

為什么以下代碼不起作用? 從邏輯上講,這似乎是合理的。

string foo = 'a' + 'b'; // Fails with an invalid int -> string conversion

現在,從上述鏈接的問題中,我們可以推斷出發生了什么:編譯器正在使用隱式char-> int轉換,然后添加這些值。 這使我相信,一定不能為char定義加法運算! 這是真的嗎?如果是這樣,為什么沒有呢?

編輯:普遍的共識是,沒有太多的定義,而我希望沒有定義的定義太多。

首先,談談您的演繹過程。 您的推論-即char轉換為int,因此char上沒有定義加法運算符-很容易理解,對您來說很好。 但是我注意到,扣除過程是不必要的。 您可能只需要閱讀規范的7.7.4節,即可清楚地描述所有內置的加法運算符。 簡而言之,它們是int + int,uint + uint,long + long,ulong + ulong,float + float,double + double,decimal + decimal,枚舉和基礎類型,委托組合,string + string,string + object和對象+字符串。 (當然,涉及值類型的那些類型的提升為可空版本。)是的,沒有使用char的加法運算符。

其次,回答您的“為什么不?” -字符有點奇怪。 它們的存儲是短整數,但是它們的語義是字符串中字符的語義。 那么應將char視為其整數形式還是一個短字符串? 在這種情況下,語言設計人員決定遵循諸如C之類的早期語言,在對不涉及字符串的數學運算時將char視為整數。 如果要將它們像短字符串一樣對待,可以使用多種方法將字符轉換為字符串。 另一個答案表明,在空字符串后面附加一個明確的內容告訴編譯器“此操作是在字符串上,而不是在字符的整數值上”。

您真正要尋找的是:

string foo = String.Concat('a', 'b');

無論如何,編譯器對字符串使用'+'運算符。

這大約是任何String.Format操作的兩倍。

我想一個人應該關注您問題中的“為什么”一詞。 在C#中,添加兩個字符的行為已定義為表示“添加Unicode值”而不是“連接”。 我們一致認為,考慮到字符串和字符與整數相比,它們比前一輩子(例如,C編程語言)具有更大的區別性,因此可以更合理地將其定義為“連接”。

“ a”是字符常量。 傳統上,至少在C語言中,字符常量只是表示整數的另一種方式。 在這種情況下,所述整數的Unicode值(“ a” = 97,“ b” = 98,依此類推)。 因此,表達式“ a” +“ b”用來表示將這兩個Unicode值相加。

要實現您的期望,請執行

String foo = "a" + "b";  // double quotes = single-character strings to concatenate

正如已經說過的,char被認為是整數而不是字符串的形式,因此從根本上說,加法運算是將兩個數字相加,而不是執行串聯。 您可以將兩個字符放入字符串中,如下所示:

string str = String.Format("{0}{1}", 'a', 'b');

為了使字符“累加”,您可以做一些與您的原始意圖類似的事情:

string foo2 = 'a' + "" + 'b'; //  Succeeds
string foo3 = 'a'.ToString() + 'b'.ToString(); // Succeeds
string foo4 = string.Concat('a', 'b'); // Succeeds

對於foo2示例,您可以通過插入空字符串為編譯器提供線索,並分別為每個char強制將隱式char轉換為字符串。

對於foo3示例,您在每個字符上使用ToString調用以允許添加兩個字符串。

您可以對字符串使用加法運算符的重載,然后嘗試以下操作:

var result = "" + 'a' + 'b';

但請不要與

var result = 'a' + 'b' + "";  // BAD !!!!!

因為它將給您int轉換為字符串並等於“ 195”。

這個想法是讓運算符+重載以插入字符串,並且您應該將第一個參數作為字符串來實現。

看起來有點像作弊,但這就是C#-毫無意義和殘酷! (實際上是.Net,它沒有運算符+(Char,Char)和C#試圖將Char強制轉換為Int32的重載)。

暫無
暫無

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

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