或者,“我做错了吗?”
我正在编写一个小函数,如果需要,将返回一个字符串,引用(作为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。
答案 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变量中的字符。