【问题标题】:C# CS0029 Cannot implicitly convert type 'char' to 'string' [duplicate]C# CS0029 无法将类型“char”隐式转换为“string”[重复]
【发布时间】:2020-04-23 04:41:20
【问题描述】:

有人可以解释为什么我不能在没有显式转换的情况下将 char 分配给字符串吗?像这样的:

char c = 'a';
string s;
s = c;

错误 CS0029 无法将类型“char”隐式转换为“string”

我知道如何将 char 转换为字符串,我的问题是为什么编译器不能隐式执行这个操作。

是因为 char 是值类型和字符串引用还是还有其他原因?

回答: 同事,感谢大家的帮助,经过一番研究,我在这里找到了非常明确的答案:https://stackoverflow.com/a/52280210/12518860

【问题讨论】:

  • 因为它们其实是不同的类型,看msdn
  • > 是因为 char 是值类型和字符串引用还是还有其他原因?仅仅因为它们是不同的类型

标签: c# string char implicit-conversion


【解决方案1】:

我知道如何将聊天转换为字符串,我的问题是为什么编译器不能隐式执行此操作。

因为char 类型中没有定义implicit operator string

我已经使用 class 而不是 struct 修改了 sample from msdn,它也适用于引用类型

顺便说一句,string是引用类型,char是struct。

public class Digit
{
    private readonly byte digit;

    public Digit(byte digit)
    {
        if (digit > 9)
        {
            throw new ArgumentOutOfRangeException(nameof(digit), "Digit cannot be greater than nine.");
        }
        this.digit = digit;
    }

    public static implicit operator byte(Digit d) => d.digit;
    public static explicit operator Digit(byte b) => new Digit(b);

    public override string ToString() => $"{digit}";
}

然后你可以直接将Digit实例转换为byte

var d = new Digit(7);

byte number = d; // here is Digit converted to the byte
Console.WriteLine(number);  // output: 7
Digit digit = (Digit)number;
Console.WriteLine(digit);  // output: 7

PS here are the implicit conversion list 用于字符

【讨论】:

    【解决方案2】:

    MSDN

    字符串是字符的连续集合,用于 表示文本。 String 对象是一个顺序集合 System.Char 表示字符串的对象; System.Char 对象 对应一个 UTF-16 编码单元。 String 对象的值为 System.Char 对象的顺序集合的内容, 并且该值是不可变的(也就是说,它是只读的)。

    charstring 类型之间没有转换。 here 描述了实例化字符串的可能方法。 string 是一个由char 元素组成的序列,不能直接将简单项赋值给序列实例,应该使用string ctor 或调用ToString() 方法

    char c = 'a';
    string s;
    s = new string(c, 1)
    

    charstring 类型之间也没有隐式转换,如 C# specification 所示

    【讨论】:

    • @Aleksandr Beliavski 这些类型之间没有隐式转换,正如您在附加链接中看到的那样。我已经更新了答案
    • 是的,我看到 char struct 没有隐式转换运算符来执行到字符串的转换,但我还是不明白这是什么原因?正如 msdn 中提到的:String 对象是 System.Char 对象的顺序集合。所以似乎没有理由 char struct 不能隐式转换为字符串。
    • @AleksandrBeliavski 我想这是为了避免潜在的问题。将char 分配给string 可能意味着您想要创建一个字符串,或者它可能是一个错字/错误。所以最好是明确的以避免潜在的问题
    【解决方案3】:

    你需要把char转换成字符串

    char c = 'a';
    string s = c.ToString();
    

    或者:

    string s = $"{c}";
    

    它们是差异类型,char 是值类型,string 是引用类型,这就是为什么在 C# 中不能轻易将 char 转换为字符串的原因

    【讨论】:

    • 这不是演员表。问题不在于如何将char 转换为string,这就是为什么它不能隐式完成。
    猜你喜欢
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    • 2020-12-31
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    相关资源
    最近更新 更多