2015-02-09 188 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(这是惯例)

相关问题