次のコードを検討してください。
var x = "tesx".Remove('x');
このコードを実行すると、次の例外が発生します。
startIndexは、stringの長さより小さくなければなりません。
このメソッドにintではなくcharを渡すことができるのはなぜですか?コンパイルエラーが発生しないのはなぜですか?
コンパイラにこの動作があるのはなぜですか?
charとして宣言されている 'x'を削除しようとしています。xは120です。
.Remove
は、int
型の2つのパラメーターのみを取り、文字列から削除する開始と(オプション)カウントを取ります。
Charを渡すと、-整数表現に変換されます。 「x」を渡した場合の意味-> 120は文字列の.Length
そしてそれがこのエラーを投げる理由です!
_Implicit conversion
_では、charをintに変換でき、明示的な変換は必要ないため、このコードをコンパイルできます。これもコンパイルされ、答えは600 (120*5)
になります-
_ char c = 'x';
int i = c;
int j = 5;
int answer = i * j;
_
[〜#〜] msdn [〜#〜] から、暗黙的な変換は以下のように要約されます-
他の人が述べているように、有効な入力でReplace
またはRemove
を使用できます。
Remove
を取るchar
のオーバーロードはないため、文字は暗黙的にint
に変換され、Remove
メソッドはそれを文字列へのインデックス。文字列の外側にあります。そのため、パラメータータイプが間違っているというコンパイル時エラーではなく、ランタイムエラーが発生します。
Remove
を使用して文字列の一部を削除するには、まずその部分が文字列のどこにあるかを見つける必要があります。例:
var x = "tesx";
var x = x.Remove(x.IndexOf('x'), 1);
これにより、最初の'x'
の文字列。複数のオカレンスがある可能性があり、すべてを削除する場合は、Replace
を使用する方が効率的です。
var x = "tesx".Replace("x", String.Empty);
Removeは、文字列内のインデックスのintパラメーターを取り、文字の削除を開始します。 msdn を参照してください。 remove呼び出しは、charを自動的にASCII整数インデックスに変換し、文字列からそのインデックスの文字を削除しようとします。文字自体を削除しようとはしていません。
文字列にxが含まれる場合を削除したい場合:
"testx".Replace("x",string.Empty);
文字列のxの最初のインデックスを削除する場合は、次の操作を行います。
var value = "testx1x2";
var newValue = value.Remove(value.IndexOf('x'), 1);
あなたは関数でcharを渡しており、この値は実行時にintに変換されているため、実行時のcharの値は文字列の長さよりも大きいため、実行時エラーが発生します。
var x = "tesx";
var s = x.Remove(x.IndexOf('x'), 1);
または
var s = x.Replace("x",string.Empty);
。Remove はパラメーターとしてintを取ります。 Removeは2つのパラメーターを取ります。 1つ目は、文字列のどの位置から開始するかです。 (カウントはゼロから始まります。)2番目のパラメーターは、指定した位置から削除する文字数です。
サイドノート:
MSDNから:
このメソッド(.Remove)は、現在のインスタンスの値を変更しません。代わりに、countパラメーターで指定された文字数が削除された新しい文字列を返します。文字は、startIndexで指定された位置で削除されます。