web-dev-qa-db-ja.com

文字列のRemove()メソッドがcharをパラメーターとして許可するのはなぜですか?

次のコードを検討してください。

var x = "tesx".Remove('x');

このコードを実行すると、次の例外が発生します。

startIndexは、stringの長さより小さくなければなりません。

このメソッドにintではなくcharを渡すことができるのはなぜですか?コンパイルエラーが発生しないのはなぜですか?

enter image description here

コンパイラにこの動作があるのはなぜですか?

58
user1968030

charとして宣言されている 'x'を削除しようとしています。xは120です。

.Removeは、int型の2つのパラメーターのみを取り、文字列から削除する開始と(オプション)カウントを取ります。

Charを渡すと、-整数表現に変換されます。 「x」を渡した場合の意味-> 120は文字列の.Lengthそしてそれがこのエラーを投げる理由です!

92
MichaC

_Implicit conversion_では、charをintに変換でき、明示的な変換は必要ないため、このコードをコンパイルできます。これもコンパイルされ、答えは600 (120*5)になります-

_        char c = 'x';
        int i = c;
        int j = 5;
        int answer = i * j;
_

[〜#〜] msdn [〜#〜] から、暗黙的な変換は以下のように要約されます-

Implicit conversion

他の人が述べているように、有効な入力でReplaceまたはRemoveを使用できます。

27
Rohit Vats

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);
21
Guffa

Removeは、文字列内のインデックスのintパラメーターを取り、文字の削除を開始します。 msdn を参照してください。 remove呼び出しは、charを自動的にASCII整数インデックスに変換し、文字列からそのインデックスの文字を削除しようとします。文字自体を削除しようとはしていません。

文字列にxが含まれる場合を削除したい場合:

"testx".Replace("x",string.Empty);

文字列のxの最初のインデックスを削除する場合は、次の操作を行います。

var value = "testx1x2";
var newValue = value.Remove(value.IndexOf('x'), 1);
9
gmn

あなたは関数で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で指定された位置で削除されます。

2
Rahul Tripathi