2009-04-01 10 views
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 })); 

    // ... 
} 

...うまくいきます。しかし、それはむしろ意味がないようです。私はポインタか固定サイズのバッファを使用しようとしていると考えている理由は分かりません。私は真剣に愚かなものを見逃しているのですか?これは問題/バグですか?

FYI、これはMicrosoft .NET FrameworkではなくMono 2.0です。私はWindowsを実行しないので、同じことをしているかどうかを確認するためにMicrosoftのC#コンパイラを持っていないので、バグかどうか疑問です。

答えて

7

まあ、コンパイルされないバグではありません。 charをとる文字列コンストラクタオーバーロードはありません。私はMonoがstring(char*)コンストラクタを意味していると思って、それを試してみた。

stringcharを変換する最も簡単な方法はしかし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*'

+0

A-ha。それは動作します。面白い;私はMSDNで見つけられませんでしたが、Monoはcharを取ったコンストラクタを示しました。私はあなたが正しいかもしれないと思う:MonoDevelopの完了表の 'char *'を表示しないので、ポインタ。ありがとう! –

+0

私は、考えられる過負荷を間違って表示しているMonoDevelopのバグだと思っています。 –

+0

それはそうだね。 Subversionからツリーをビルドしてそこにまだ存在していることを確認するとすぐにバグレポートを提出します。 –

1
System.String

に変換することができません。

二つの可能性があります。

String(Char*) 

または

String(Char[]) 

があなたの目のオプションが機能する理由はここにあり、と最初はあなたがポインタ(危険な)に合格しようとしている考えています。

0

new string()に1つのcharを使用するオーバーロードはありません。あなたが実際に得ているのは、char *をとるオーバーロードです。つまり、NULLで終了する文字配列へのポインタを期待していますが、ポインタは安全でないコンテキストでのみ許可されます。

よりもむしろアレイを作成、あなたがnew string(ch, 1)

0

を行うことができ、私はするあなたの「新しい文字列を返す(CH)を」変化するであろう「(ch.ToStringを返す)」 文字列は単一をとるコンストラクタを持っていませんchar。しかし、それはcharとcountを取るものを持っています。

"new string(ch、1)"と入力すると、ch変数に含まれる1文字の文字列を作成できます。

2

.NETでコンパイルされたコードと同じコードでは、パラメータとしてcharを使用する文字列コンストラクタのオーバーロードがないというエラーメッセージが表示されます。最も近いマッチは、charへのポインタをとるものなので、そのエラーメッセージをMonoで取得する理由があります。

あなたは、char、カウントを取るオーバーロードを使用することができます。

return new String(ch, 1); 

それとも、ToStringメソッドを使用することができます

return ch.ToString(); 

または静的ToStringメソッド:

return Char.ToString(ch); 
関連する問題