Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我会得到一个“;无法隐式转换类型';字符[]和#x27;至';字符串';[C#programs]”;_C#_String_Linq_Type Conversion - Fatal编程技术网

为什么我会得到一个“;无法隐式转换类型';字符[]和#x27;至';字符串';[C#programs]”;

为什么我会得到一个“;无法隐式转换类型';字符[]和#x27;至';字符串';[C#programs]”;,c#,string,linq,type-conversion,C#,String,Linq,Type Conversion,。。。当我在C#中尝试这个时: 但当我尝试这一点时,情况并非如此: string reversedName = new string (name.ToCharArray().Reverse().ToArray()); ??当我尝试将一个To.String()链接添加到第一个方法的末尾时,运行时不会引发异常,而是返回:System.Char[] 我正在寻找一种解释,解释为什么编译器似乎无法将char[]隐式转换为string: *除非调用新字符串, *即使我们将ToString()函数链接到此处

。。。当我在C#中尝试这个时:

但当我尝试这一点时,情况并非如此:

string reversedName = new string (name.ToCharArray().Reverse().ToArray());
??当我尝试将一个To.String()链接添加到第一个方法的末尾时,运行时不会引发异常,而是返回:
System.Char[]

我正在寻找一种解释,解释为什么编译器似乎无法将char[]隐式转换为string: *除非调用
新字符串
, *即使我们将
ToString()
函数链接到此处的末尾。

如果您尝试

string reversedName = new string (name.ToCharArray().Reverse().ToArray());
您正在使用其构造函数创建字符串。如您所见,第一个参数是字符数组:

但是这里

reversedName = name.ToCharArray().Reverse().ToArray();
您正在返回一个
数组
(末尾带有.ToArray()),该数组显然不能分配给
字符串类型的变量

正如您已经注意到的那样,在
array
上调用
ToString()
将打印其类型
System.Char[]

Char数组对象上的ToString()将返回
System.Char[]
,因为这是默认和预期的行为。编译器不能假定您希望将每个字符连接到一个字符串中,然后返回该字符串

正确的方法是使用
新字符串(char[])

您也可以始终使用扩展类来添加扩展方法

public static class Extensions
{
    public static string ConvertToString(this char[] array)
    {
        return new string(array);
    }
}
用法:

string s = array.ConvertToString();

char[]
string
是不同的类型。。。C#不是C/C++因为字符串不是C#中的字符数组。编译器似乎无法运行,因为它没有意义。保持你的语言直截了当。显然,第二个例子是构造函数。所以你知道为什么这是正确的吗?为什么C团队没有从char[]进行隐式运算符转换?可能是因为他们有一个构造函数,通常隐式对话不是你想要的。@aquinas好吧,这是一个很好的解释(对于C#noob),我的收获:构造函数和普通赋值的不同的可转换性标准,是的,有道理。我猜编译器假设我只想在(字符串)构造函数中使用每个字符时将其转换为单个字符串。对吗?对。实际上,使用字符串构造函数,编译器不需要假设——您是显式地告诉它这样做的,因为在这种情况下没有歧义
string s = array.ConvertToString();