无法将类型 '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
(这是惯例)
以下代码在 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
(这是惯例)