Почему.ToString () на нулевой строке вызывают ошибку null, когда.ToString () отлично работает на nullable int с нулевым значением?



selectedItem имеет два поля:




  • int? _cost

  • string _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, но не на нулевой строке?

805   8  

8 ответов:

, потому что string типа null на самом деле нечего, нет объекта в памяти.
но int? тип (nullable) даже со значением, установленным в null по-прежнему указывает на некоторый объект.
если вы прочитали Джеффри Рихтера " CLR via C#", то обнаружите, что nullable type-это просто фасадные классы для общих типов с некоторыми инкапсулированными логиками, чтобы сделать работу с DB null более удобной.

Регистрация msdn чтобы узнать о типах с нулевым значением.

A Nullable<int> Это struct и на самом деле не может быть null. Таким образом, вызов метода на "нулевой" структуре все еще работает.

есть какая-то" магия компилятора", которая делает _cost == null допустимое выражение.

int? на самом деле это не объект сам по себе, но это

строка является ссылочным типом, но 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.

теперь, когда мы называем ToString on _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(); //error

yiels ошибка, потому что это вызов функции ToString (), который является членом

Comments

    Ничего не найдено.