3

なぜこれが機能するのですか?

ComboBox cb = sender as ComboBox;
int validSelection = Convert.ToInt32(cb.Tag);
if (cb.SelectedIndex != validSelection) {
    cb.SelectedIndex = validSelection;
}

...でも、これ:

ComboBox cb = sender as ComboBox;
int validSelection = (int)cb.Tag; // <-- fails
if (cb.SelectedIndex != validSelection) {
    cb.SelectedIndex = validSelection;
}

...「オブジェクトがオブジェクトの参照に設定されていません」というエラーが発生しましたか?

4

6 に答える 6

13

これは、変換がキャストと同じではないためです。

cb.Tagはおそらく、stringではなく、intであり、一方を他方に直接変換することはできません。Convert.ToInt32()実際にを解析し、変換された値stringで新しいintを作成します。

キャストは、あるタイプのインスタンスを別のタイプのインスタンスとして解釈しようとするだけです。

于 2012-07-18T20:54:48.607 に答える
7

1)ドキュメントに記載Convert.ToInt32(null)されているように、常に0を返します

2)数値を表すnullように、をにキャストすることはできません。Nullable int()はnull値を許可します。intintint?

于 2012-07-18T20:55:46.763 に答える
4

ボックス化された値型は、実際の型にのみボックス化解除できるため、の値がTag実際にはintでない場合、fromのキャストはobject失敗します。さらに、の値Tagがnullの場合、値の型をnullにすることはできないため、キャストは失敗します。

一方、を使用する場合、メソッドは値を次Convert.ToInt32のように変換するために必要なすべての手順を実行します。Int32

  • 文字列の場合は、解析します。
  • の場合はInt64、ボックスを解除してInt64に変換し、次にInt32;に変換します。
  • nullの場合は、0を返します
于 2012-07-18T20:55:25.273 に答える
3

前者は、メソッドをサポートするTagが必要です。後者はそれがである必要があります。IConvertableToInt32Tagint

于 2012-07-18T20:55:34.263 に答える
1

キャストは次のように述べています。「このことを[何でも](intこの場合)として表すメモリ内のビットを解釈します。

変換によると、「これは実際にはメモリ内で非常に異なるものですが、私が望むものに変換する方法を知っているので、そうして結果を返してください」。

于 2012-07-18T20:56:58.187 に答える
1

Convertには、 Convert.ToInt32(string)など、さまざまなデータ型からの変換を試行できるようにする多数のオーバーロードがあります。

指定された数値の文字列表現を同等の32ビット符号付き整数に変換します。

タグはおそらく、Convertが処理できるタイプ(文字列など)です。

于 2012-07-18T20:54:51.957 に答える