38

null を int32 に変換すると、今日これに出くわしました

Convert.ToInt32(null)

0を返します

私は InvalidCastException を期待していました...

なぜこれが起こるのですか?

4

6 に答える 6

47

なぜこれが起こるのか考えていますか?

それが文書化された動作だからですか?それがそうであるかどうかにかかわらずConvert.ToInt32(object)Convert.ToInt32(string)ドキュメントは非常に明確に述べています:

(戻り値の下)

値の数値に相当する32ビットの符号付き整数。値がnullの場合は0(ゼロ)。

また

値に相当する32ビットの符号付き整数。値がnullの場合はゼロ。

いつものように、現実が期待と一致しない場合、最初にすべきことは、期待が文書化された動作と一致するかどうかを確認することです。

個人的には、Gavinが示した「VB6との互換性」の議論を完全には購入していません。私はそれがマイクロソフトから来ていることを理解しています、そしてそれはそれがそのように振る舞う本当の理由かもしれません-しかし私はそれがそのように振る舞う正当な理由ではないと思います。VB固有の変換方法はたくさんあります。したがって、フレームワークの設計者がゼロを返すことが理想的ではないと真剣に考えた場合は、最善を尽くして、VB6プログラマーが使用できるVB6互換の変換を提供する必要があります。

明らかに、動作が.NET 1.0で定義されると、それ以降のバージョンでは変更できませんでしたが、VB6と同じように動作する必要があると言っているのと同じではありません。

于 2012-07-20T13:22:42.333 に答える
13

http://msdn.microsoft.com/en-us/library/sf1aw27b.aspxを参照してください

編集

上記のURLは自動的に最新のフレームワークバージョンに戻りますが、以下のテキストはバージョン4に具体的に投稿されています。テキストを示す以下の改訂されたURLを参照してください。

http://msdn.microsoft.com/en-us/library/sf1aw27b(v=vs.100).aspx

それは説明します:

文字列がnullの場合、Convertクラスのすべての文字列から数値への変換メソッドはゼロを返します。この動作の元々の動機は、既存のVisualBasic6変換メソッドの動作を反映した一連の変換メソッドをVisualBasic6からVisualBasic.NETに移行するプログラマーに提供することでした。Visual Basicは従来、型変換に変換メソッドを使用していたのに対し、C#プログラマーはキャスト演算子に慣れていると想定されていました。

従来、.NET Frameworkは、バージョン間で高度な互換性を維持しようとしてきました。事実上、これは、非常に説得力のある理由がない限り、メソッドが特定の方法で実装され、その実装が公開されると(文字列パラメーターがnullの場合に0を返すメソッドのように)、変更できないことを意味します。確立された動作に依存するコードを壊します。これにより、提案された両方のソリューションが非常に問題になります。最初のケースでは、例外をスローすると、null文字列に対してゼロを返すメソッドに依存する可能性が高い顧客のメソッドの実装が変更されます。2番目のケースでは、.NETFrameworkが過負荷解決で戻り型を考慮しないことを覚えておくことが重要です。これは、メソッドが既存のConvertを置き換える必要があることを意味します。

.NETでサポートされている各プリミティブ数値タイプに対して文字列から数値への変換を実行するための推奨メソッドはParseであるため、Convertクラスの文字列から数値への変換メソッドの場合、互換性に関するこの懸念はさらに強くなります。 Framework、および各Parseメソッドは、対応するConvertメソッドとは異なる動作をします。変換される文字列がnullの場合にゼロを返すConvertクラスの文字列から数値への変換メソッドとは異なり、各ParseメソッドはArgumentNullExceptionをスローします。これは、主張して​​いる動作です。Int32.ParseやDouble.Parseなどの数値Parseメソッドのオーバーロードには、解析操作をよりきめ細かく制御できるという利点もあります。

于 2012-07-20T13:22:48.743 に答える
5

Int32 のデフォルト値はゼロであるためです。Int32 は参照型ではなく値型であるため、null にすることはできません。そのため、代わりにデフォルト値を取得します。

于 2012-07-20T13:21:26.187 に答える
5

それが返されることが文書化されているからです。おそらく、あなたは を考えていたの(int)nullでしょう。NullReferenceExceptionInvalidCastException

于 2012-07-20T13:21:55.383 に答える
3

これはメソッドが Convert クラスでどのように記述されているかによるものです。パラメータ値が のnull場合は、単に 0 を返しています。

public static int ToInt32(object value)
{
    if (value == null)
    {
        return 0;
    }
    else
    {
        return ((IConvertible)value).ToInt32(null);
    }
}
于 2012-07-20T13:24:24.260 に答える
2

InvalidCastException を取得するには、制御されていないキャストを行う必要があります。

例えば:

int i = (int)null;

実行すると、例外が発生するはずです。

の用法

Convert.ToInt32(var)

データベースから読み取る場合など、 varの値を信用できない場合に役立ちます。

于 2014-08-25T11:15:57.657 に答える