无法隐式转换类型'字符串'到' String'

时间:2015-02-09 11:52:32

标签: c# types compiler-errors

以下代码无法使用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;
    }
}

4 个答案:

答案 0 :(得分:8)

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

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

你可以完全省略这一点:

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

您的第二种方法之所以有效,是因为您现在使用string来消除名为String的类型参数的歧义。

这意味着您的串联包含名为String的泛型类型,其类型为stringstring字面值和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);
    }
}