无法将类型 'string' 隐式转换为 'String'

Cannot implicitly convert type 'string' to 'String'

以下代码在 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;
    }
}

Append<String> 不是类型,它是类型参数的名称。它与使用 T 相同,只是现在您将其命名为 String.

显然这会产生问题,因为现在您尝试将名称为 String 的泛型类型连接到 string 文字。

你完全可以忽略这个:

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

第二种方法起作用的原因是因为您现在使用 string 消除了名为 String.

的类型参数的歧义

这意味着您的连接包含名为 String 的通用类型,它具有实际类型 string、一个 string 文字和一个类型 string 的变量。这可以再次编译,但它很难看,你不应该这样做。

您遇到的问题是,您使用了泛型类型参数 String,它被编译器理解为 "some type, but let us call it String" 而不是实际类型 System.String.

此外,不需要使扩展方法通用,因为第一个参数 this String str 已经定义了目标类型。只需删除类型参数即可:

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

我认为这通过正确的扩展方法以及 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);
    }
}

编译器看到你的声明:

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

然后它将 String 视为类型参数。所以 str 不是(必然)类型 System.String。无论您的类型参数是什么,它都是如此。第二个参数,即 app 但是属于 System.String 类型,因为您使用了小写字母 string。你身上有

return str + " " + app;

意思是"take str and add it to string " " and then to string app",但是编译器不知道如何添加str,因为它是未知类型String

最好完全删除类型参数,因为无论如何您都不会使用它,但是如果您希望它保留,您应该将其名称更改为 T(这是惯例)