Почему приведение null к примитиву (то есть: int) в .net 2.0 вызывает исключение null ref, а не недопустимое исключение приведения? - PullRequest
3 голосов
/ 12 декабря 2008

Я просматривал некоторый код и столкнулся со сценарием, в котором мой комбобокс еще не был инициализирован. Это в .NET 2.0 и в следующем коде this.cbRegion.SelectedValue имеет значение null.

int id = (int)this.cbRegion.SelectedValue;

Этот код выдал исключение нулевой ссылки вместо недопустимого исключения приведения. Мне было интересно, если бы кто-нибудь знал, почему он генерирует исключение нулевой ссылки вместо недопустимого приведения?

Ответы [ 4 ]

9 голосов
/ 12 декабря 2008

Это связано с Боксом и распаковкой. Он пытается вытащить int из коробки (unbox), но объект имеет значение null, поэтому вы получаете исключение нулевой ссылки, прежде чем оно получит изменение для приведения.

8 голосов
/ 12 декабря 2008

Если вы компилируете

object o = null;
int a = (int)o;

и посмотрите код MSIL, вы увидите что-то вроде

ldnull
...
unbox.any int32

Теперь поведение unbox.any определяется следующим образом:

InvalidCastException выдается, если объект не в штучной упаковке.

NullReferenceException генерируется, если obj является пустой ссылкой.

Это то, что вы видите в своем коде.

1 голос
/ 12 декабря 2008

Он пытается прочитать объект, прежде чем он его наложит. Следовательно, вы получаете нулевое исключение вместо исключения приведения.

0 голосов
/ 12 декабря 2008

Исключение составляет выбранное значение, которое равно нулю. Он даже не попадает в актерский состав.

...