【问题标题】:Why do I get a "Cannot implicitly convert type 'char[]' to 'string' [C# programs]"为什么我会收到“无法将类型 'char[]' 隐式转换为 'string' [C# 程序]”
【发布时间】:2017-05-24 20:46:15
【问题描述】:

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

string reversedName;
reversedName = name.ToCharArray().Reverse().ToArray();

但当我尝试这个时不是:

string reversedName = new string (name.ToCharArray().Reverse().ToArray());

?当我尝试在第一个方法的末尾添加链接 To.String() 时,运行时不会抛出异常而是返回:System.Char[]

我正在寻找关于为什么编译器似乎无法将 char[] 隐式转换为字符串的解释: * 除非显然调用new string, * 即使我们将ToString() 函数链接到那里。

【问题讨论】:

  • char[]string 是不同的类型... C# 不是 C/C++
  • 因为字符串不是 C# 中的字符数组。编译器似乎不能,因为它没有意义。保持语言简洁。
  • 显然第二个例子是一个构造函数。所以你知道为什么它是正确的吗?为什么 C# 团队不从 char[] 进行隐式运算符转换?可能是因为他们有一个构造函数,通常隐式转换不是你想要的。
  • @aquinas 好的,这是一个很好的解释(对于 C# 菜鸟),我的收获:构造函数和普通赋值的可转换性不同标准,是的,这是有道理的。

标签: c# string linq type-conversion


【解决方案1】:

当你尝试时

string reversedName = new string (name.ToCharArray().Reverse().ToArray());

您正在使用其构造函数创建 string。如您所见,第一个参数是字符数组: https://msdn.microsoft.com/en-us/library/ms131424(v=vs.110).aspx

这里

reversedName = name.ToCharArray().Reverse().ToArray();

您正在返回一个 array(末尾带有 .ToArray()),这显然不能分配给 string 类型的变量。

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

【讨论】:

    【解决方案2】:

    Char Array 对象上的 ToString() 将返回 System.Char[],因为它是默认行为和预期行为。编译器不能假定您想将每个 char 加入一个字符串,然后返回该字符串。

    正确的方法是使用new string(char[])

    您也可以随时使用扩展类来添加扩展方法。

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

    用法:

    string s = array.ConvertToString();
    

    【讨论】:

    • 我猜编译器假设我只想在(字符串)构造函数中使用它时将每个字符转换为单个字符串。对吗?
    • 是的。实际上,使用字符串构造函数,编译器不需要假设 - 你明确告诉它这样做,因为在这种情况下没有歧义
    猜你喜欢
    • 2020-06-16
    • 2013-04-02
    • 1970-01-01
    • 2022-07-06
    • 2020-04-23
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    相关资源
    最近更新 更多