2014-03-06 132 views
3

我遇到類似的代碼來執行以下操作:字符串數組加字符串不是錯誤,爲什麼?

var a = (new string [] {}) + string.Empty; 

我想問:

  • 爲什麼這個代碼可以編譯(爲什麼isn`t類型這個錯誤)?
  • 如何理解這種行爲?
+0

在這種情況下,c#將調用默認方法'.ToString()'on'(new string [] {})'因爲串聯 – Franck

回答

6

在.NET Framework中有3 +運算符重載。

從C#規格$7.8.4 Addition operator

string operator + (string x, string y); 
string operator + (string x, object y); 
string operator + (object x, string y); 

這就是爲什麼你var a = (new string [] {}) + string.Empty;第三超載匹配。

+ (object x, string y)使用String.Concat(object, object)過載即implemented like;

public static String Concat(Object arg0, Object arg1) 
{ 
    if (arg0 == null) 
    { 
     arg0 = String.Empty; 
    } 

    if (arg1==null) { 
     arg1 = String.Empty; 
    } 
    return Concat(arg0.ToString(), arg1.ToString()); 
} 

而且,由於new string [] {}null因爲在MSIL,它使用newarr和它的文件;

堆棧轉換行爲,按順序爲:

  1. 陣列中元件的數量被壓入堆棧。
  2. 從堆棧中彈出元素的數量並創建數組。
  3. 對新數組的對象引用被壓入堆棧。

這就是爲什麼它使用在最後object.ToString()方法。

從它的文檔;

ToString是.NET Framework中的主要格式化方法。它 將對象轉換爲其字符串表示形式,以便它適合顯示 。 ToString方法的默認實現返回類型

的完全 限定名作爲結果的aSystem.String[]

4

的C#語言規範的過載

string operator +(object x, string y) 

它通過調用x.ToString()工作(如果x不爲空,否則只是使用"")並連接與y

因此您的代碼應產生相同的

string a = string.Concat((new string[] {}).ToString(), string.Empty); 

所以現在的問題是如何ToString()string[]類型實現。事實證明,它不會從object的執行中覆蓋。

2

它編譯,因爲+運營商將撥打string[].ToString這是object.ToString它將返回類型的名稱。所以無意義結果是"System.String[]"

string[] abc = { "a", "b", "c" }; 
string a = abc + string.Empty; // --> System.String[] 
1
var s = (new String[] {"a", "b"}) + " ABD"; 

它將調用上new String[] {"a", "b"}陣列對象toString()方法,用字符串 「ABD」 串連它。

相關問題