[英]Why does the compiler require convoluted syntax for this?
或者,“我做錯了嗎”?
我正在編寫一個小的 function ,它將返回一個字符串,如果需要的話,它會被引用(作為可引用的打印),否則它會按原樣返回。 function中輸入一個字符; 結果是一個字符串。
我最初嘗試做的是:
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 框架。 我沒有運行 Windows,所以我沒有微軟的 C# 編譯器來查看它是否做同樣的事情,這就是為什么我想知道它是否是一個錯誤。
好吧,它不是無法編譯的錯誤。 沒有字符串構造函數重載需要一個字符。 我懷疑 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*)'
的最佳重載方法匹配有一些無效的 arguments
Test.cs(8,31):錯誤 CS1503:參數 '1':無法從'char'
轉換為'char*'
在 .NET 中編譯的相同代碼會給出錯誤消息,即以 char 作為參數的字符串構造函數沒有重載。 最接近的匹配是帶有指向字符的指針的匹配,因此這可能就是您在 Mono 中收到該錯誤消息的原因。
您可以使用采用 char 和 count 的重載:
return new String(ch, 1);
或者您可以使用 ToString 方法:
return ch.ToString();
或 static ToString 方法:
return Char.ToString(ch);
System.String沒有采用單個字符的構造函數。
有兩種可能:
String(Char*)
或者
String(Char[])
這就是為什么您的第二個選項有效的原因,第一個是認為您正在嘗試傳遞一個指針(不安全)。
采用單個字符的new string()
沒有重載。 您實際上得到的是采用 char* 的重載,這意味着它需要一個指向以空字符結尾的字符數組的指針,但僅在不安全的上下文中才允許使用指針。
而不是創建一個數組,你可以做new string(ch, 1)
我會將您的“return new string(ch)”更改為“return ch.ToString()”字符串沒有采用單個字符的構造函數。 但是,它確實有一個需要一個字符和一個計數。
您可以 go "new string(ch, 1 )" 創建一個包含 1 個字符的字符串,這將是 ch 變量中的內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.