2015-02-09 212 views
1

以下代碼無法在C#中使用錯誤Cannot implicitly convert type 'string' to 'String'進行編譯。無法將類型'字符串'隱式轉換爲'字符串'

void Main() 
{ 
    Console.Write("Hello".Append("Mark")); 
} 

public static class Ext 
{ 
    public static String Append<String>(this String str, String app) 
    { 
     return str + " " + app; 
    } 
} 

您可以通過擴展方法去除類型參數修正編譯錯誤,但我不知道爲什麼這個不能編譯因爲typeof(string) == typeof(String)評估爲true

下也工作得很好:

void Main() 
{ 
    Console.Write("Hello".Append("Mark")); 
} 
public static class Ext 
{ 
    public static string Append<String>(this String str, string app) 
    { 
     return str + " " + app; 
    } 
} 
+2

你爲什麼有這裏有一個類型約束''? – 2015-02-09 11:53:43

+0

我正在寫一些使用T參數的擴展方法,但是這隻對String有意義,所以我用String替換了T,並且很驚訝地收到錯誤。它當然不需要在那裏。以下代碼編譯並運行得很好: 'void Main() { Console.Write(「Hello」.Append(「Mark」)); } 公共靜態類分機 { 公共靜態字符串追加(此字符串str,字符串app) { 返回STR + 「」 +應用; } }' – MarkFl 2015-02-09 11:57:03

+2

由於第一個參數'this String str'已經定義了目標類型,所以不需要擴展方法。 – helb 2015-02-09 11:57:55

回答

8

Append<String>不是一個類型,它是一個類型參數的名稱。這與使用T相同,除了現在您將其命名爲String

很顯然,這給了一個問題,因爲現在你試圖將名稱String與泛型類型連接到string文字。

你可以只省略此乾脆:

public static String Append(this String str, String app) 
{ 
    return str + " " + app; 
} 

你的第二個方法工作的原因是因爲你現在使用string其刪除名爲String類型參數的不確定性。

這意味着你的級聯由一個名爲String具有實際類型string,一個string文字和string類型的變量通用型的。這可以再次編譯,但它很醜,你不應該這樣做。

2

你的問題在於,你使用了一個泛型類型參數String,它被編譯器視爲「某種類型,但讓我們稱之爲字符串」,而不是實際類型System.String

此外,由於第一個參數this String str已經定義了目標類型,因此不需要使擴展方法具有通用性。只是刪除類型參數,你是好去:

public static string Append(this string str, string app) 
{ 
    return str + " " + app; 
} 
-1

I'think問題得以解決與正確的擴展方法,也的String.format的使用()

class Program 
{ 
    static void Main() 
    { 
     Console.Write("Hello".Append("Mark")); 
    } 
} 

public static class Ext 
{ 
    public static System.String Append(this System.String str, System.String app) 
    { 
     return System.String.Format("{0} {1}", str,app); 
    } 
} 
0

編譯器看到您的聲明:

public static string Append<String>(this String str, string app) 

然後它將String作爲類型參數。所以str不是(必然)System.String類型。無論你的類型參數如何,它都是。第二個參數,即app但是是System.String,因爲您使用了小寫字母string。在身體,你有

return str + " " + app; 

這意味着「採取str,並把它添加到字符串" ",然後串app」,但是編譯器不知道如何添加str,因爲它是未知類型String的。

這將是最好完全取消類型參數,因爲你不無論如何使用它,但如果你想留下來,你應該改名爲T(這是慣例)

相關問題