Почему.ToString () на нулевой строке вызывают ошибку null, когда.ToString () отлично работает на nullable int с нулевым значением?
selectedItem имеет два поля:
int? _coststring _serialNumber
в этом примере _cost и _serialNumber на selectedItem - оба null. Я читаю через поля selectedItem через их свойства и заполнение текстовых полей их значениями, когда...
TextBox1.Text = selectedItem.Cost.ToString(); //no error
TextBox2.Text = selectedItem.SerialNumber.ToString(); //error
Я понимаю, что SerialNumber.ToString() является избыточным (потому что это уже строка), но я не понимаю, почему это вызывает это исключение:
Nullable объект должен иметь значение.
int? _costдопускает и не имеет значения, но это не дает мне исключение.
string _serialNumberдопускает и не имеет значения, но это тут дайте мне исключение.
этот вопрос затрагивает его, парень по существу спрашивает то же самое, но нет назначенного ответа, и это также не объясняет, почему обнуляется int? Например, могу ли я использовать .ToString() на nullable int, но не на нулевой строке?
8 ответов:
, потому что
stringтипаnullна самом деле нечего, нет объекта в памяти.
ноint?тип (nullable) даже со значением, установленным вnullпо-прежнему указывает на некоторый объект.
если вы прочитали Джеффри Рихтера " CLR via C#", то обнаружите, что nullable type-это просто фасадные классы для общих типов с некоторыми инкапсулированными логиками, чтобы сделать работу с DB null более удобной.Регистрация msdn чтобы узнать о типах с нулевым значением.
A
Nullable<int>Этоstructи на самом деле не может быть null. Таким образом, вызов метода на "нулевой" структуре все еще работает.есть какая-то" магия компилятора", которая делает
_cost == nullдопустимое выражение.
строка является ссылочным типом, но nullable int является типом значения. Вот хорошее обсуждение различий http://www.albahari.com/valuevsreftypes.aspx.
Nullable на самом деле является структурой, предоставляющей два свойства: HasValue и Value. Если вы сделаете это, вы получите ошибку:
int? i = null; i.Value.ToString()для того, чтобы проверить, является ли ваш int? имеет значение, к которому вы можете получить доступ
i.HasValue
Я думаю, что причина в том, что когда компилятор встречает примитивный тип данных, он обертывает его в соответствующий объект. Вызов метода toString () - это просто косвенный вызов(перенос и затем вызов метода) здесь, и исключение обрабатывается там. В то время как в случае String, мы непосредственно вызываем метод. При указании на значение null метод создает исключение.
причина проста.
int?илиNullable<int>это struct или тип значения,он никогда не может быть null.так что же происходит, когда мы делаем:
int? _cost = null;
_costбудет иметь два поляValueиHasValue, когда мы назначаемnullдо_costегоHasValueфлаг будет установлен вfalseиValueполе будет назначенаdefault(T)в случаеint?это0.теперь, когда мы называем
ToStringon_cost,Nullable<T>имеет переопределение определенияToString, которые, если мы посмотрим на Microsoft предоставила ссылку на источник реализуется как:public override string ToString() { return HasValue ? value.ToString() : ""; }таким образом, он возвращает пустую строку, поскольку
_costназначенnull.теперь идет дело
string _serialNumber. Бытьstringэто ссылочный тип, и он может чисто провестиnull. Если он держитnullзатем вызовToStringна нем будет произведено исключение нулевой ссылки, как и ожидалось.вы можете увидеть: типы значений и ссылочные типы-MSDN
TextBox2.Text = selectedItem.SerialNumber.ToString(); //erroryiels ошибка, потому что это вызов функции ToString (), который является членом
Comments