1

或者,“我做错了吗”?

我正在编写一个小函数,该函数将返回一个字符串,如有必要,将其引用(作为可引用的可打印),否则按原样返回。一个字符被输入到函数中;结果是一个字符串。

我最初尝试做的是:

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,所以我没有微软的 C# 编译器来查看它是否做同样的事情,这就是为什么我想知道它是否是一个错误。

4

5 回答 5

7

好吧,它不是无法编译的错误。没有字符串构造函数重载需要一个字符。我怀疑 Mono 认为你的意思是string(char*)构造函数并尝试过 - 导致错误。

char将 a 转换为 a的最简单方法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*'

于 2009-04-01T18:19:37.210 回答
2

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

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

return new String(ch, 1);

或者您可以使用 ToString 方法:

return ch.ToString();

或静态 ToString 方法:

return Char.ToString(ch);
于 2009-04-01T18:25:16.730 回答
1

System.String没有采用单个字符的构造函数。

有两种可能:

String(Char*)

或者

String(Char[])

这就是为什么您的第二个选项有效的原因,第一个是认为您正在尝试传递一个指针(不安全)。

于 2009-04-01T18:20:36.913 回答
0

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

而不是创建一个数组,你可以做new string(ch, 1)

于 2009-04-01T18:21:35.897 回答
0

我会将您的“return new string(ch)”更改为“return ch.ToString()”字符串没有采用单个字符的构造函数。但是,它确实有一个需要一个字符和一个计数。

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

于 2009-04-01T18:22:46.843 回答