簡體   English   中英

為什么編譯器為此需要復雜的語法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM