キャストとConvert.To()メソッドの使用の違い


88

doubleonstring値をキャストする関数があります。

string variable = "5.00"; 

double varDouble = (double)variable;

コードの変更がチェックインされ、プロジェクトは次のエラーでビルドされます。 System.InvalidCastException: Specified cast is not valid.

しかし、次のことをした後...

string variable = "5.00"; 

double varDouble = Convert.ToDouble(variable);

...プロジェクトはエラーなしでビルドされます。

キャスティングとConvert.To()メソッドの使用の違いは何ですか?なぜキャストはスローしException、使用はスローConvert.To()しないのですか?

c#  casting 


6
参照された質問に関して、OPはキャストまたは変換をいつ使用するかを尋ね、受け入れられた回答は「どちらを使用するかは本当に選択の問題です」と述べています。キャストと改宗者の違いを求めています。私の意見では、以下の回答(kudos SO!)は、「これまたはそれを選択して使用する」との違いについての詳細を提供します...そしてこの詳細は、本質的に、より多くの情報に基づいた選択を行うために使用できます。

@ edmastermind29プログラミングのコンテキストでは、「xとyの違いは何ですか」と「xとyをいつ使用するか」の間に大きな違いはありません。両者はお互いに答えます。
nawfal 2013年

2
ほぼ3年後、この場合、一方が他方に相互に答えているようには見えません。Q:「XとYの違いは何ですか?」A:「どちらを使用するかは本当に選択の問題です。」あまり役に立ちません。

パフォーマンスが最高であるという直接的な答えを持っている人はいないようです。私の経験から、特にこのような列の値を取得する場合は、Castの方が優れていることがわかります。(int)datatable.Rows [0] [0]、if私たちはその100%intを知っています
Sundara Prabu 2017

回答:


126

どういうわけか同等と思われるかもしれません、目的はまったく異なります。まず、キャストとは何かを定義してみましょう。

キャストとは、あるデータ型のエンティティを別のデータ型に変更するアクションです。

これは少し一般的で、キャストは変換の構文が同じであることが多いため、変換と何らかの形で同等です。そのため、言語でキャスト(暗黙的または明示的)がいつ許可され、いつ((詳細)明示的な変換?

まず、それらの間に簡単な線を引きます。正式には(言語構文と同等であっても)キャストはタイプを変更しますが、変換は値を変更します/変更する可能性があります(最終的にはタイプと一緒に)。また、キャストはリバーシブルですが、変換はリバーシブルではない場合があります。

このトピックはかなり広大なので、カスタムキャスト演算子をゲームから除外して少し絞り込んでみましょう。

暗黙のキャスト

C#では、情報が失われない場合、キャストは暗黙的です(このチェックは、実際の値ではなく型を使用して実行されることに注意してください)。

プリミティブ型

例えば:

int tinyInteger = 10;
long bigInteger = tinyInteger;

float tinyReal = 10.0f;
double bigReal = tinyReal;

変換中に情報が失われることはないため、これらのキャストは暗黙的です(タイプを広くするだけです)。逆に暗黙的なキャストは許可されていません。これは、実際の値に関係なく(実行時にのみチェックできるため)、変換中に一部の情報が失われる可能性があるためです。たとえば、このコードはコンパイルされません。doubleこれは、にfloat:で表現できない値が含まれている可能性があるためです(実際にはコンパイルされます)。

// won't compile!
double bigReal = Double.MaxValue;
float tinyReal = bigReal;

オブジェクト

オブジェクト(へのポインタ)の場合、コンパイラがソースタイプが派生クラスである(または実装する)ことを確認できる場合、キャストは常に暗黙的です。次に例を示します。

string text = "123";
IFormattable formattable = text;

NotSupportedException derivedException = new NotSupportedException();
Exception baseException = derivedException;

この場合、コンパイラはそれが実装されていること認識しており、それは(から派生している)ので、キャストは暗黙的です。オブジェクトはタイプを変更しないため、情報が失われることはありません(これは、キャストを使用して別のタイプの新しいオブジェクトを作成するため、sおよびプリミティブタイプとは異なります)。変更されるのは、オブジェクトのビューです。stringIFormattableNotSupportedExceptionExceptionstruct

明示的なキャスト

変換がコンパイラーによって暗黙的に行われない場合、キャストは明示的であり、キャスト演算子を使用する必要があります。通常、それは次のことを意味します。

  • 情報やデータが失われる可能性があるため、注意する必要があります。
  • 変換が失敗する可能性があるため(一方のタイプをもう一方のタイプに変換できないため)、繰り返しになりますが、何をしているのかを知っておく必要があります。

プリミティブ型

変換中に一部のデータが失われる可能性がある場合、プリミティブ型には明示的なキャストが必要です。次に例を示します。

double precise = Math.Cos(Math.PI * 1.23456) / Math.Sin(1.23456);
float coarse = (float)precise;

float epsilon = (float)Double.Epsilon;

どちらの例でも、値が範囲内にある場合でも、float情報(この場合は精度)が失われるため、変換は明示的である必要があります。今これを試してください:

float max = (float)Double.MaxValue;

この変換は失敗するので、繰り返しになりますが、明示的である必要があるため、それを認識してチェックを行うことができます(この例では、値は一定ですが、実行時の計算またはI / Oから取得される場合があります)。あなたの例に戻る:

// won't compile!
string text = "123";
double value = (double)text;

コンパイラはテキストを数値に変換できないため、これはコンパイルされません。テキストには、数字だけでなく任意の文字を含めることができます。これは、C#では、明示的なキャストの場合でも多すぎます(ただし、別の言語では許可される場合があります)。

オブジェクト

型が関連していない場合、ポインタから(オブジェクトへの)変換が失敗する可能性があります。たとえば、このコードはコンパイルされません(コンパイラは可能な変換がないことを認識しているため)。

// won't compile!    
string text = (string)AppDomain.Current;
Exception exception = (Exception)"abc";

このコードはコンパイルされますが、実行時に失敗する可能性があります(キャストされたオブジェクトの有効なタイプによって異なります)InvalidCastException

object obj = GetNextObjectFromInput();
string text = (string)obj;

obj = GetNextObjectFromInput();
Exception exception = (Exception)obj;

変換

それで、最後に、キャストが変換である場合、なぜ私たちはのようなクラスが必要なのConvertですか?キャストを使用したC#ではコンパイラに次のように言うため、実際にはConvert実装とIConvertible実装に起因する微妙な違いを無視します。

私を信じてください、このタイプはあなたが今それを知ることができなくてもそのタイプです、私にそれをさせてください、そしてあなたは見るでしょう。

-または-

心配しないでください。この変換で何かが失われるかどうかは気にしません。

それ以外の場合は、より明示的な操作が必要です(簡単なキャストの影響について考えてください。そのため、C ++では長く冗長で明示的な構文が導入されました)。これには複雑な操作が含まれる場合があります(string->double変換の場合は解析が必要になります)。stringたとえば、への変換は(ToString()メソッドを介して)常に可能ですが、期待するものとは異なる意味を持つ可能性があるため、キャストよりも明示的である必要があります(書くほど、自分がしていることについて考えるようになります)。

この変換は、カスタム変換演算子(キャストするクラスで定義)またはより複雑なメカニズム(TypeConverterたとえば、sまたはクラスメソッド)を使用して、オブジェクト内で(そのための既知のIL命令を使用して)実行できます。何が起こるかはわかりませんが、失敗する可能性があることはわかっています(そのため、より制御された変換が可能な場合はIMOを使用する必要があります)。あなたの場合、変換は単にを解析しstringdouble:を生成します。

double value = Double.Parse(aStringVariable);

もちろん、これは失敗する可能性があるため、これを行う場合は、スローされる可能性のある例外を常にキャッチする必要があります(FormatException)。ここではトピックから外れていますが、aTryParseが使用可能な場合は、それを使用する必要があります(意味的に、数値ではない可能性があり、失敗するのがさらに速いためです)。

.NETでの変換はTypeConverter、ユーザー定義の変換演算子を使用した暗黙的/明示的なキャスト、IConvertibleメソッドの実装と解析など、さまざまな場所から発生する可能性があります(何かを忘れましたか?)。それらの詳細については、MSDNを参照してください。

この長い答えを終えるために、ユーザー定義の変換演算子についてほんの少しだけ説明します。プログラマーがキャストを使用して、あるタイプを別のタイプに変換できるようにするのは、単なる砂糖です。これは、クラス(キャストされるもの)内のメソッドであり、「ねえ、彼/彼女がこの型をその型に変換したいのなら、私はそれを行うことができます」と言います。例えば:

float? maybe = 10; // Equals to Nullable<float> maybe = 10;
float sure1 = (float)maybe; // With cast
float sure2 = maybe.Value; // Without cast

この場合、失敗する可能性があるため明示的ですが、これは実装に委ねられます(これに関するガイドラインがある場合でも)。次のようなカスタム文字列クラスを作成するとします。

EasyString text = "123"; // Implicit from string
double value = (string)text; // Explicit to double

あなたの実装では、「プログラマーの生活を楽にする」ことを決定し、キャストを介してこの変換を公開することを決定できます(これは書き込みを減らすための単なるショートカットであることを忘れないでください)。一部の言語ではこれが許可される場合もあります。

double value = "123";

任意のタイプへの暗黙的な変換を許可します(チェックは実行時に行われます)。適切なオプションを使用すると、これは、たとえばVB.NETで実行できます。それはただ異なる哲学です。

私はそれらで何ができますか?

したがって、最後の質問は、いつどちらを使用するかです。明示的なキャストをいつ使用できるか見てみましょう。

  • 基本タイプ間の変換。
  • からobject他のタイプへの変換(これには開封も含まれる場合があります)。
  • 派生クラスから基本クラス(または実装されたインターフェース)への変換。
  • カスタム変換演算子を使用した、あるタイプから別のタイプへの変換。

最初の変換のみを実行できるConvertため、他の変換は選択の余地がなく、明示的なキャストを使用する必要があります。

いつ使用できるか見てみましょうConvert

  • 任意の基本タイプから別の基本タイプへの変換(いくつかの制限があります。MSDNを参照してください)。
  • 実装IConvertibleする任意のタイプから他の(サポートされている)タイプへの変換。
  • byte配列と文字列との間の変換。

結論

IMOConvertは、キャストで同じ変換を実行できる場合でも(他に何かが利用可能でない限り)、変換が失敗する可能性があることがわかっている場合は常に使用する必要があります(形式、範囲、またはサポートされていない可能性があるため)。誰があなたのコードを読むのか、あなたの意図は何か、そしてそれが失敗するかもしれないことを明らかにします(デバッグを簡素化します)。

他のすべてについてはキャストを使用する必要があり、選択の余地はありませんが、別のより良い方法が利用できる場合は、それを使用することをお勧めします。あなたの例では、からstringへの変換doubleは(特にテキストがユーザーからのものである場合)非常に頻繁に失敗するものであるため、たとえばTryParseメソッドを使用して、可能な限り明示的にする必要があります(さらに制御を強化する必要があります)。

編集:それらの違いは何ですか?

更新された質問と私が以前に書いたことを維持すること(使用できる/使用する必要があるときと比較してキャストを使用できるときについてConvert)によると、明確にする最後のポイントは、それらの間に違いがあるかどうかです(さらに、操作を実行できるようにConvert使用IConvertibleIFormattableインターフェイスキャストでは許可されていません)。

簡単な答えは「はい」です。動作が異なります。このConvertクラスはヘルパーメソッドクラスのように見えるので、多くの場合、何らかの利点やわずかに異なる動作を提供します。例えば:

double real = 1.6;
int castedInteger = (int)real; // 1
int convertedInteger = Convert.ToInt32(real); // 2

かなり違いますよね?キャストは切り捨てられますが(これは私たち全員が期待することです)、Convert最も近い整数への丸めを実行します(これは、知らない場合は予期されない可能性があります)。それぞれの変換方法には違いがあるため、一般的なルールを適用することはできず、ケースバイケースで確認する必要があります...他のすべてのタイプに変換するには19の基本タイプ...リストはかなり長くなる可能性があり、MSDNのケースバイを参照する方がはるかに優れています場合!


質問を変更して、Difference between casting and using the Convert.To() method。そうでなければ、非常に包括的な答え。(私の質問が再開されることを願っています...)

@ edmastermind29質問を少し編集しました。長い回答でもトピックが長すぎます(リストへの変換が300以上可能)。Convertは、キャストだけでなく、「プレーンな」IConvertibleおよびIFormattableインターフェイスに対しても利点(または単に予期しない動作?)を追加します。
アドリアーノレペッティ2013年

double整数を表さない値はに「変換可能」である必要があるというCから借りた概念は嫌いintです。キャストは、たとえば、実数と変換された値の組み合わせを保持するInt32から値を取得する場合に適切なパラダイムのように見えます[で正確に表現できない値を変換しようとすると、予期しない状態が示されます例外をトリガーする必要があります]が、損失の多い変換が必要な場合は、必要な形式について具体的に説明する必要があると思います。double[]Int32doubleint32
スーパーキャット2013年

1
もう1つの違いは、オブジェクト型とプリミティブ型です。例object o = 123; var l = Convert.ToInt64(o); var i = (long) (int) o; var f = (long) o // InvalidCastException
yue shi

1
@ rory.apそれは重要なポイントです。いいえ、正式にはそれはキャスト(float-> int)ではなく強制です。キャストは、たとえばDerivedClass->BaseClassです。C#では両方に同じ単語(および演算子)を使用しているため、混乱を招きますが、実際には別個のものです。それらを区別するための正式な定義は、私が書いたものよりも少し複雑です。
アドリアーノレペッティ

12

キャストはコンパイラに次のように伝える方法です。「この変数はBarだと思っているのは知っていますが、たまたまあなたよりも多くのことを知っています。オブジェクトは実際にはFooなので、Fooのように扱います。今。" 次に、実行時に、実際のオブジェクトが実際にFooであることが判明した場合、コードは機能します。オブジェクトがFooでなかったことが判明した場合、例外が発生します。(具体的にはSystem.InvalidCastException。)

一方、変換は、「Barタイプのオブジェクトを提供すると、そのBarオブジェクトの内容を表す新しいFooオブジェクトを作成できます。元のオブジェクトは変更しません。変更しません」という言い方です。元のオブジェクトを別の方法で処理すると、他の値に基づいた新しいもの作成されます。それをどのように行うかについては、何でもかまいません。その場合はConvert.ToDoubleDouble.Parseこれには、どのタイプの文字列がどの数値を表すかを決定するためのあらゆる種類の複雑なロジックがあります。文字列をdoubleに異なる方法でマッピングする独自の変換メソッドを作成できます(おそらく、ローマ数字など、数字を表示するためのまったく異なる規則をサポートするためです)。変換は何でもできますが、実際にはコンパイラーに何かをするように依頼しているわけではありません。コンパイラは、あなたの助けがなければ、(例として)astringをにマップする方法を知る方法がないため、新しいオブジェクトを作成する方法を決定するコードを書いているのはあなたですdouble

それで、あなたはいつ改宗し、いつキャストしますか?どちらの場合も、あるタイプの変数、たとえばAがあり、タイプBの変数が必要です。Aオブジェクトが実際に内部でBである場合、キャストします。それが実際にはBでない場合は、それを変換し、プログラムがAからBを取得する方法を定義する必要があります。


SOの投稿の1つで、Eric Lippertは、暗黙のキャスト と呼ばれるものはなく、暗黙の変換であると述べました。私はキャストと変換を同じ意味で使用しています。「暗黙のキャスト」と言うことの何が問題になっていますか?キャストを必要とせずに変換が暗黙的である場合、それは「暗黙的キャスト」と言えますか?
rahulaga_dev 2018年

1
@RahulAgarwalキャストは、特定のタイプが別のタイプの有効なインスタンスである(または作成できる)ことを明示的に示す必要がある操作です。暗黙的な変換が存在する場合、その型を別の型として扱うためにキャストは必要ありません。したがって、「暗黙のキャスト」と言っても実際には意味がありません(Ericが言及したように、開発者が入力せずにキャスト演算子が追加されるいくつかの状況を除いてforeach)。これらの例外を除いて、キャストは定義上明示的です。
Servy 2018年

5

差出人MSDN

明示的な変換(キャスト):明示的な変換にはキャスト演算子が必要です。変換中情報が失われる可能性がある場合、または他の理由で変換が成功しない可能性がある場合は、キャストが必要です。典型的な例としては、精度や範囲が狭い型への数値変換や、基本クラスのインスタンスから派生クラスへの変換などがあります。

次の例を考えてみましょう。

double a = 2548.3;
int b;
b = (int)a; //2548 --> information (.3) lost in the conversion

そしてまた:

キャストは、変換を行う予定であり、データ損失が発生する可能性があることを認識していることをコンパイラーに明示的に通知する方法です。

互換性のないタイプSystem.Convert間で変換する場合は、クラスを使用できます。主な違いの間にキャストする変換があり、コンパイル実行時間。型変換の例外は実行時に表示されます。つまり、実行時に失敗した型キャストにより、がスローされます。 InvalidCastException


結論:キャストでaは、実際に型であるコンパイラーに指示しているbので、そうであれば、プロジェクトは次の例のようなエラーなしでビルドされます。

double s = 2;
int a = (int) s;

しかし、あなたがから新しいオブジェクトを作成する方法があるコンパイラに言っているの変換におけるaタイプのはb、それを実行してくださいし、プロジェクトがエラーなしでビルドしますが、私は言ったように型キャストが実行時に失敗した場合、それが原因となりますInvalidCastExceptionの投げられる

たとえば、コンパイラは型の式DateTimeを型にキャストできないことを検出するため、以下のコードはコンパイルされませんint

DateTime s = DateTime.Now;
int a = (int)(s);

しかし、これは正常にコンパイルされています。

DateTime s = DateTime.Now;
int a = Convert.ToInt32(s);

しかし、実行時に次のようになりInvalidCastExceptionます。

'DateTime'から 'Int32'へのキャストが無効です。


4

Convert.Doubleこの方法は、実際には内部的に呼び出すDouble.Parse(string)方法を。

どちらのStringタイプもDoubleキャストは常に失敗しますので、タイプは、2つのタイプの明示的/暗黙的な変換を定義します。

このDouble.Parseメソッドは、の各文字を調べ、の文字のstring値に基づいて数値を作成しますstring。いずれかの文字が無効な場合、Parseメソッドは失敗します(Convert.Doubleメソッドも失敗します)。


1
そして、これは明示的なキャストとどのように異なりますか?

3
明示的なキャストは、データ型が何であるかを調べるのではなく、バイトを調べるだけです。例として、char x = '1'を整数に
キャストし

@ user1751547では、ユーザーはConvert.ToDouble()バイトを超えてデータを検討しますか?

@ user1751547それがこの質問に正しく答えるために必要な一種の直感だと思います。単に「定義されていない」と言うのは少し議論の余地があります。
Ant P

@ edmastermind29はい、入力タイプを調べます。文字列の場合は、各文字を調べます。charのASCII値が49の場合、それは「1」文字であり、適切に変換されます
user1751547

3

あなたの例では、文字列をdouble(非整数型)にキャストしようとしています。

それが機能するためには、明示的な変換が必要です。

また、intに変換すると、double値の小数部分が失われる可能性があるため、Convert.ToDouble代わりに使用できた可能性があることを指摘する必要がありConvert.ToInt64ます。

変数の値が「5.25」の場合、varDoubleは5.00になります(Int64への変換のために0.25の損失)

キャストと変換に関する質問に答えるため。

キャスト(明示的なキャスト)が明示的なキャストの要件を満たしていません。キャスト演算子を使用してキャストしようとしている値が無効です(つまり、整数ではありません)。

キャスト/変換のルールについては、このMSDNページにアクセスしてください


@ edmastermind29回答を更新しました。それがあなたの質問に答えることを願っています。
スカータグ2013年

私の質問に関連して、明示的なキャストの要件は何ですか?それは「非積分」値に関するものですか?

@ edmastermind29はい。数値型にキャストしようとしている値が非数値の場合、キャストは無効です。変換が必要です。
スカータグ2013年

3

キャストには変換は含まれません。つまり、値の内部表現は変更されません。例:

object o = "Hello"; // o is typed as object and contains a string.
string s = (string)o; // This works only if o really contains a string or null.

あなたは、変換することができますdoublestring、これを好みます

double d = 5;
string s = d.ToString(); // -> "5"

// Or by specifying a format
string formatted = d.ToString("N2"); // -> "5.00"

いくつかの方法でastringをadoubleに変換できます(ここではそのうちの2つだけ)。

string s = "5";
double d = Double.Parse(s); // Throws an exception if s does not contain a valid number

または安全な方法

string s = "5";
double d;
if (Double.TryParse(s, out d)) {
    Console.WriteLine("OK. Result = {0}", d);
} else {
    Console.WriteLine("oops!");
}

Convert.ToDouble()内部でDouble.Parse()。を呼び出します。それは使用に私の利点にあるConvert.ToDouble()Double.Parse()か、なぜ?

Convert.ToDoubleさまざまなタイプの入力を受け入れるオーバーロードがたくさんあります。文字列が渡されると、オーバーロード受け入れstringは戻ります。これを除けば、私はそれを使用することに利点はないと思います。0.0null
Olivier Jacot-Descombes 2013年

それで、または...またはDouble.Parse()私が考慮すべき何かを提供することがありますか?

Double.Parse()よりも直接的ですConvert.ToDouble()。文字列に有効な数値が含まれていることが確実な場合は、安全に使用できますDouble.TryParse。それ以外の場合は、を使用することをお勧めします。
Olivier Jacot-Descombes 2013年

1
string variable = "5.00";     
double varDouble = (double)variable;

上記の変換は、言語によって許可されていません。数値タイプの明示的なキャストのリストは次のとおりです。http//msdn.microsoft.com/en-us/library/yht2cx7b.aspxご覧のとおり、すべての数値タイプを別の数値タイプに変換できるわけではありません。

ここでキャストに関するいくつかの詳細情報

そして、これはConvert.ToDouble()とどのように異なりますか?

型をキャストしても、データ構造は変更されません。さて、数値変換の場合、それはいくつかのビットを失うか、いくつかの追加の0ビットを得るかもしれません。しかし、あなたはまだ数を扱っています。その数が占めるメモリの量を変更しているだけです。これは、コンパイラが必要なすべてを実行するのに十分安全です。

しかし、文字列を数値にキャストしようとすると、変数が使用するメモリの量を変更するだけでは不十分であるため、それを行うことはできません。たとえば、5.00文字列は「数字」のシーケンスであるため:53(5)46(。)48(0)48(0)-これはASCII用ですが、文字列には同様のものが含まれます。コンパイラが文字列から最初のN(doubleの場合は4?わからない)バイトを取得する場合、その部分には完全に異なるdouble番号が含まれます。同時に、Convert.ToDouble()は、文字列の各記号を取得し、それが表す数字を計算し、文字列が数値を表す場合は二重の数値を作成する特別なアルゴリズムを実行します。PHPのような言語は、大まかに言えば、バックグラウンドでConvert.ToDoubleを呼び出します。しかし、C#は、静的に型付けされた言語のように、それを行いません。これにより、すべての操作がタイプセーフであり、次のような予期しないことが発生しないことを確認できます。

double d = (double)"zzzz"

@ edmastermind29私の更新された答えを参照してください。私はそれを説明しようとしました。説明は完璧にはほど遠いですが、違いを説明しているとしましょう。
Viktor S.

1

このような文字列をdoubleにキャストすることは、C#では許可されていません。そのため例外が発生します。文字列を変換する必要があります(許容可能な変換パスを示すMSDNドキュメント)。これは、文字列に必ずしも数値データが含まれるとは限らないが、さまざまな数値タイプに含まれる(null値を除く)ためです。AConvertは、文字列をチェックして数値に変換できるかどうかを確認するメソッドを実行します。可能であれば、その値を返します。できない場合は、例外をスローします。

それを変換するには、いくつかのオプションがあります。あなたConvertはあなたの質問でメソッドを使用しました、Parseそれは大体似てConvertいますが、あなたがすることを可能にするであろうTryParseも見るべきです:

string variable = "5.00"; 

double varDouble;

if (Double.TryParse(variable, out varDouble)) {
    //Code that runs if the conversion succeeded.
} else {
    //Code that runs if the conversion failed.
}

これにより、数値以外の文字列を実行しようとしたConvert場合に発生する可能性のある例外を回避できParseます。


変換が成功したかどうかをチェックTryParseするConvertので、overを使用することは私の利点TryParseですか?

@ edmastermind29そう思います。変換が失敗した場合、Convertは例外をスローします。TryParseはブール値を返し、変換が成功した場合はTrueを返し、失敗した場合はFalseを返します。
キーン

1

double varDouble = (double)variableそれvariableはすでにダブルであると仮定します。variableがdoubleでない場合(文字列)、これは失敗します。 double varDouble = Convert.ToDouble(variable)それが言うように-それは変換します。ダブルを解析または抽出できる場合は、そうvariableします。

私は2番目に使用するDouble.ParseDouble.TryParse、何が起こっているのかをより明確に示しているためです。あなたは文字列から始めて、それがdoubleに変換可能であることを期待しています。疑問がある場合は、を使用してくださいTryParse

variableがメソッド引数の場合、タイプをdoubleに変更します。発信者に正しいタイプを提供する責任を負わせます。そうすれば、コンパイラが自動的に機能します。


-1

最も重要な違いは、型キャストが使用され、変換が失敗した場合(たとえば、非常に大きなfloat値をintに変換している場合)、例外はスローされず、intが保持できる最小値が表示されることです。ただし、Convertを使用する場合、そのようなシナリオでは例外がスローされます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.