1

それとも「私のやり方が悪いの?」

必要に応じて引用符で囲まれた (quoted-printable として) 文字列を返す小さな関数を作成しています。それ以外の場合はそのまま返します。文字が関数に入力されます。結果は文字列です。

私が最初にやろうとしたことは次のとおりです。

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

    // ...
}

ただし、コンパイラは、その return ステートメントをコンパイルするときに、CS0214、「ポインターと固定サイズのバッファーは安全でないコンテキストでのみ使用できます」と表示します。代わりにコードを変更すると、次のようになります。

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

    // ...
}

...それはうまくいきます。しかし、それはかなり無意味に思えます。単なる文字であるため、ポインターまたは固定サイズのバッファーを使用しようとしていると考える理由がわかりません。私は何か非常にばかげたことを見逃していますか、それともこれは問題/バグですか?

参考までに、これは Microsoft .NET Framework ではなく、Mono 2.0 です。私は Windows を実行していないので、Microsoft の 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 をパラメーターとして受け取る文字列コンストラクターのオーバーロードがないというエラー メッセージを表示します。最も近い一致は、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には、1 つの文字を受け取るコンストラクターがありません。

次の 2 つの可能性があります。

String(Char*)

また

String(Char[])

これが2番目のオプションが機能する理由であり、最初のオプションは、ポインターを渡そうとしていると考えています(安全ではありません)。

于 2009-04-01T18:20:36.913 に答える
0

「return new string(ch)」を「return ch.ToString()」に変更します文字列には、単一の文字を受け取るコンストラクターがありません。ただし、文字とカウントを取るものがあります。

「new string(ch, 1 )」に移動して、ch 変数に含まれる 1 文字を含む文字列を作成できます。

于 2009-04-01T18:22:46.843 に答える
0

new string()単一の文字を取るためのオーバーロードはありません。実際に取得しているのは、char* を受け取るオーバーロードです。つまり、null で終わる文字配列へのポインターが必要ですが、ポインターは安全でないコンテキストでのみ許可されます。

配列を作成するのではなく、次のことができますnew string(ch, 1)

于 2009-04-01T18:21:35.897 に答える