2017-01-26 3 views
1

動作しない型鋳造のは、私は方法は、番号を印刷するオブジェクトのパラメータを取るとしましょう

Console.WriteLine((int)target); 

が、それは動作しないし、例外をスローする、なぜ我々はTryParseメソッドを使用する必要がありますか?

+0

あなたはそれが何を動作しないでください:object本当に本当にint(またはint?)であればasのみ動作しますか?キャスティングをするとエラーになりますか? – ngeksyo

答えて

7

なぜTryParseメソッドを使用する必要がありますか?

あなたがTryParse方法を使用する場合、変換に失敗した場合、それはあなたのコードに例外をスローしませんので。このように(int)targetにキャストすると、intへの変換が失敗した場合は例外がスローされます

+0

target == nullの場合、 '.ToString()'を呼び出そうとすると例外がスローされますので、nullパラメータを渡すとTryParseもスローされます。おそらく '(文字列)target? 0 "またはTryParseを呼び出す前にヌルチェックを追加する –

+0

はい、その場合、C#6の**ヌル条件付き演算子**を使用してヌルチェックを処理できます。例: 'target?.ToString()'これは、オブジェクトの値がnullの場合に例外をスローしないようにします。 – prtdomingo

+0

C#6を使用している場合は動作しますが、nullは例外を発生させません。それは問題ありません(または '(string)target'を使うだけです)。 –

2

このようにしてObject型に明示的にキャストすることはできません。 Convertクラスを使用する必要があります。ただ、もう少し、これを肉付けする

Console.WriteLine(Convert.toInt32(target)); 
+0

しかし、私は "ABC"のようなものを入力しなかった、私はオブジェクトとして整数を入力した、なぜ私はそれを戻すことができないのですか? – grooveline

+1

入力した内容は問題ではありません。タイプとして「オブジェクト」が表示されます。これは内容については何も知らない。文字列を与えた場合、「これはオブジェクト型だが、ユーザーが文字列を与えて文字列のキャストを許可する」という考えはない。単に "Object" – James

2

- C#でキャスティング

は、適切なキャスト演算子を見つけようとします。 targetオブジェクトがintであるか、適切なキャスト演算子(たとえば、byteまたはshortの場合)が適切な場合は、実行時に正しく変換されます。ただし、演​​算子がない場合は、targetstringstringintにキャストするための良いデフォルトの方法はありません。stringにはどのようなキャストが行われますか)など、演算子がない場合はInvalidCastExceptionがスローされます。 。

例外はありますが、予期しないことが発生した場合に備えて予約する必要があります。ユーザーの入力が数字である場合とそうでない場合があります(またはstringが数字である場合もあります)。だから、try/catchブロックをこのコードに書くことは残虐で、stringが数字だったかどうかを何らかの形でチェックして決定することができる場合(つまり、とにかくtry/catchブロックで何をしようとしているのか) 。 stringがヌルでないことを確認して、RegExを実行したり、数値以外の文字を探して文字を繰り返したりしてください(これはintでは非常に難しくありませんが、科学記号表記、または記号/空白/コンマ/小数/等を許可するか許可しない数値書式)。また、.Parse()を呼び出すこともできますが、例外の問題に再度戻ってきます(覚えておいてください:例外はブール値をチェックするよりも投げて捕らえるのがよりコストがかかる)。

.NETフレームワークでは、より良い選択肢が得られます。TryParse。一部の種類のオーバーロードでは、形式やスタイルを指定することもできます(float.TryParse()DateTime.TryParse()/DateTime.TryParseExact()など)。この方法では、文字列が数値か日時かをチェックする必要があるたびに、ブール値をチェックすることでプログラムフローをより効率的に制御できます。また、ほとんどのオブジェクトが文字列に変換されるので、ずっとうまくいく。あなたのプログラムは、例外を投げ出すのではなく、無効な入力を処理する方法を決定することができます(これは過度なことかもしれません)。入力が数値でない場合に例外をスローしたい場合でも、InvalidCastExceptionをスローするのではなく、より具体的な例外をスローすることができます。ValidationFailureExceptionのようなものを投げて、どのパラメータ/引数/ノードが正しくありませんでした。

何らかの理由で、あなたのメソッドがobject(おそらくそれはあなたが変更できないインターフェース定義に準拠している)を取らなければならないが、あなたの入力は通常intであると信じるならば、あなたはasnullにつながることができるので、あなたが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 
関連する問題