我遇到類似的代碼來執行以下操作:字符串數組加字符串不是錯誤,爲什麼?
var a = (new string [] {}) + string.Empty;
我想問:
- 爲什麼這個代碼可以編譯(爲什麼isn`t類型這個錯誤)?
- 如何理解這種行爲?
我遇到類似的代碼來執行以下操作:字符串數組加字符串不是錯誤,爲什麼?
var a = (new string [] {}) + string.Empty;
我想問:
在.NET Framework中有3 +
運算符重載。
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
和它的文件;
堆棧轉換行爲,按順序爲:
- 陣列中元件的數量被壓入堆棧。
- 從堆棧中彈出元素的數量並創建數組。
- 對新數組的對象引用被壓入堆棧。
這就是爲什麼它使用在最後object.ToString()
方法。
從它的文檔;
ToString是.NET Framework中的主要格式化方法。它 將對象轉換爲其字符串表示形式,以便它適合顯示 。 ToString方法的默認實現返回類型
的完全 限定名作爲結果的a
會System.String[]
。
的C#語言規範的過載
string operator +(object x, string y)
它通過調用x.ToString()
工作(如果x
不爲空,否則只是使用""
)並連接與y
。
因此您的代碼應產生相同的
string a = string.Concat((new string[] {}).ToString(), string.Empty);
所以現在的問題是如何ToString()
在string[]
類型實現。事實證明,它不會從object
的執行中覆蓋。
它編譯,因爲+
運營商將撥打string[].ToString
這是object.ToString
它將返回類型的名稱。所以無意義結果是"System.String[]"
:
string[] abc = { "a", "b", "c" };
string a = abc + string.Empty; // --> System.String[]
var s = (new String[] {"a", "b"}) + " ABD";
它將調用上new String[] {"a", "b"}
陣列對象toString()方法,用字符串 「ABD」 串連它。
在這種情況下,c#將調用默認方法'.ToString()'on'(new string [] {})'因爲串聯 – Franck