動作しない型鋳造のは、私は方法は、番号を印刷するオブジェクトのパラメータを取るとしましょう
Console.WriteLine((int)target);
が、それは動作しないし、例外をスローする、なぜ我々はTryParseメソッドを使用する必要がありますか?
動作しない型鋳造のは、私は方法は、番号を印刷するオブジェクトのパラメータを取るとしましょう
Console.WriteLine((int)target);
が、それは動作しないし、例外をスローする、なぜ我々はTryParseメソッドを使用する必要がありますか?
なぜTryParseメソッドを使用する必要がありますか?
あなたがTryParse
方法を使用する場合、変換に失敗した場合、それはあなたのコードに例外をスローしませんので。このように(int)target
にキャストすると、int
への変換が失敗した場合は例外がスローされます
target == nullの場合、 '.ToString()'を呼び出そうとすると例外がスローされますので、nullパラメータを渡すとTryParseもスローされます。おそらく '(文字列)target? 0 "またはTryParseを呼び出す前にヌルチェックを追加する –
はい、その場合、C#6の**ヌル条件付き演算子**を使用してヌルチェックを処理できます。例: 'target?.ToString()'これは、オブジェクトの値がnullの場合に例外をスローしないようにします。 – prtdomingo
C#6を使用している場合は動作しますが、nullは例外を発生させません。それは問題ありません(または '(string)target'を使うだけです)。 –
このようにしてObject
型に明示的にキャストすることはできません。 Convert
クラスを使用する必要があります。ただ、もう少し、これを肉付けする
Console.WriteLine(Convert.toInt32(target));
しかし、私は "ABC"のようなものを入力しなかった、私はオブジェクトとして整数を入力した、なぜ私はそれを戻すことができないのですか? – grooveline
入力した内容は問題ではありません。タイプとして「オブジェクト」が表示されます。これは内容については何も知らない。文字列を与えた場合、「これはオブジェクト型だが、ユーザーが文字列を与えて文字列のキャストを許可する」という考えはない。単に "Object" – James
- C#でキャスティング
は、適切なキャスト演算子を見つけようとします。 target
オブジェクトがint
であるか、適切なキャスト演算子(たとえば、byte
またはshort
の場合)が適切な場合は、実行時に正しく変換されます。ただし、演算子がない場合は、target
がstring
(string
をint
にキャストするための良いデフォルトの方法はありません。string
にはどのようなキャストが行われますか)など、演算子がない場合はInvalidCastException
がスローされます。 。
例外はありますが、予期しないことが発生した場合に備えて予約する必要があります。ユーザーの入力が数字である場合とそうでない場合があります(またはstring
が数字である場合もあります)。だから、try/catch
ブロックをこのコードに書くことは残虐で、string
が数字だったかどうかを何らかの形でチェックして決定することができる場合(つまり、とにかくtry/catch
ブロックで何をしようとしているのか) 。 string
がヌルでないことを確認して、RegExを実行したり、数値以外の文字を探して文字を繰り返したりしてください(これはint
では非常に難しくありませんが、科学記号表記、または記号/空白/コンマ/小数/等を許可するか許可しない数値書式)。また、.Parse()
を呼び出すこともできますが、例外の問題に再度戻ってきます(覚えておいてください:例外はブール値をチェックするよりも投げて捕らえるのがよりコストがかかる)。
.NETフレームワークでは、より良い選択肢が得られます。TryParse
。一部の種類のオーバーロードでは、形式やスタイルを指定することもできます(float.TryParse()
やDateTime.TryParse()/DateTime.TryParseExact()
など)。この方法では、文字列が数値か日時かをチェックする必要があるたびに、ブール値をチェックすることでプログラムフローをより効率的に制御できます。また、ほとんどのオブジェクトが文字列に変換されるので、ずっとうまくいく。あなたのプログラムは、例外を投げ出すのではなく、無効な入力を処理する方法を決定することができます(これは過度なことかもしれません)。入力が数値でない場合に例外をスローしたい場合でも、InvalidCastException
をスローするのではなく、より具体的な例外をスローすることができます。ValidationFailureException
のようなものを投げて、どのパラメータ/引数/ノードが正しくありませんでした。
何らかの理由で、あなたのメソッドがobject
(おそらくそれはあなたが変更できないインターフェース定義に準拠している)を取らなければならないが、あなたの入力は通常intであると信じるならば、あなたはas
がnull
につながることができるので、あなたがNULL可能int型を使用する必要があること
var intTarget = target as int?
if (intTarget != null)
{
Console.WriteLine(intTarget);
}
ノートのような何かを行うことができます。これはおそらくTryParse
を使用して終了したいので、この特定のシナリオでは役に立たないかもしれませんが、as
が失敗した場合は、フレームワークによって提供されていないクラスであるより複雑なオブジェクトを処理する場合に役立ちます。TryParse
。しかし、これはチェックよりもキャストの行に沿っていることに注意してください。object
本当にがの場合は、数字の文字列です。
object target = "32";
var intTarget = target as int?; // intTarget == null
intTarget = int.Parse(target); // intTarget == 32;
target = 33;
intTarget = target as int?; // intTarget == 33
あなたはそれが何を動作しないでください:
object
本当に本当にはint
(またはint?
)であればas
のみ動作しますか?キャスティングをするとエラーになりますか? – ngeksyo