为什么编译器需要复杂的语法?

时间:2009-04-01 18:15:08

标签: c# .net string mono char

或者,“我做错了吗?”

我正在编写一个小函数,如果需要,将返回一个字符串,引用(作为quoted-printable),否则按原样返回。字符输入到函数中;结果是一个字符串。

我最初尝试做的是:

private string QuotedChar(char ch) {
    if(ch < (char)128 && !char.IsWhiteSpace(ch))
        return(new string(ch));

    // ...
}

但是,在编译返回语句时,编译器说CS0214,“指针和固定大小的缓冲区只能在不安全的上下文中使用”。如果我改变代码改为:

private string QuotedChar(char ch) {
    if(ch < (char)128 && !char.IsWhiteSpace(ch))
        return(new string(new char[] { ch }));

    // ...
}

......它运作得很好。然而,这似乎毫无意义。我不明白为什么它认为我试图使用指针或固定大小的缓冲区,因为它只是一个字符。我错过了一些严重愚蠢的事情,还是这是一个问题/错误?

仅供参考,这是Mono 2.0,而不是Microsoft .NET Framework。我不运行Windows,因此我没有使用Microsoft的C#编译器来查看它是否做同样的事情,这就是为什么我想知道它是否是一个bug。

5 个答案:

答案 0 :(得分:7)

嗯,这不是一个不能编译的bug。没有字符串构造函数重载,它接受一个char。我怀疑Mono认为你的意思是string(char*)构造函数并尝试过 - 导致错误。

char转换为string的最简单方法是简单地调用ToString()

private string QuotedChar(char ch) {
    if(ch < (char)128 && !char.IsWhiteSpace(ch))
        return ch.ToString()

    // ... 
}

MS C#编译器猜测相同的重载,但给出了不同的错误消息:

  

Test.cs(8,20):错误CS1502:最好的   重载方法匹配   'string.String(char*)'有一些   无效的论点
  Test.cs(8,31):错误CS1503:参数   '1':无法从'char'转换为'char*'

答案 1 :(得分:2)

在.NET中编译的相同代码会给出错误消息,即字符串构造函数没有重载,它将char作为参数。最接近的匹配是获取指向char的指针,因此这可能是您在Mono中获得该错误消息的原因。

您可以使用带有char和count的重载:

return new String(ch, 1);

或者您可以使用ToString方法:

return ch.ToString();

或静态ToString方法:

return Char.ToString(ch);

答案 2 :(得分:1)

System.String没有构造函数,只需要一个char。

有两种可能性:

String(Char*)

String(Char[])

这就是为什么你的第二个选项有效,第一个选择是认为你试图传入一个指针(不安全)。

答案 3 :(得分:0)

new string()没有超载,只需要一个字符。你实际得到的是带有char *的重载,这意味着它需要一个指向以null结尾的字符数组的指针,但只有在不安全的上下文中才允许使用指针。

您可以执行new string(ch, 1)

,而不是创建数组

答案 4 :(得分:0)

我会将你的“return new string(ch)”更改为“return ch.ToString()” string没有一个带有单个char的构造函数。然而,它有一个需要一个字符和一个计数。

你可以去“new string(ch,1)”来创建一个包含1个字符的字符串,这将是ch变量中的字符。