以下代码无法使用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;
}
}
您可以通过从扩展方法中删除Type参数来修复编译错误,但我想知道为什么在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;
}
}
答案 0 :(得分: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
类型的变量。这可以再次编译,但它很难看,你永远不应该这样做。
答案 1 :(得分:2)
你遇到的问题是你使用泛型类型参数String
,它被编译器认为是“某种类型,但我们称之为String”而不是实际类型System.String
此外,由于第一个参数this String str
已经定义了目标类型,因此无需使扩展方法具有通用性。只需删除类型参数,您就可以了:
public static string Append(this string str, string app)
{
return str + " " + app;
}
答案 2 :(得分: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
(这就是惯例)
答案 3 :(得分:-1)
我认为这可以通过正确的扩展方法解决您的问题,也可以使用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);
}
}