Почему GetType для свойства строки приводит к исключению NullReferenceException? - PullRequest
2 голосов
/ 09 октября 2009

Когда я вызываю GetType для свойства int или DateTime, Я получаю ожидаемые результаты, но на строковое свойство, Я получаю исключение NullReferenceException (?):

private int      PropInt    { get; set; }
private DateTime PropDate   { get; set; }
private string   propString { get; set; }

WriteLine(PropInt.GetType().ToString());    // Result : System.Int32
WriteLine(PropDate.GetType().ToString());   // Result : System.DateTime
WriteLine(propString.GetType().ToString()); // Result : NullReferenceException (?!)

Может кто-нибудь объяснить, как получилось? Чем струнная опора отличается от интропой?

Ответы [ 4 ]

8 голосов
/ 09 октября 2009

Если значение свойства null, вы получите исключение NullReferenceException при попытке доступа к методам или свойствам объекта, например GetType(). Примитивные типы, такие как int и DateTime, являются типами значений, и поэтому не могут содержать значение null, поэтому GetType() не потерпит неудачу больше, чем любая другая их функция-член.

2 голосов
/ 09 октября 2009

Чтобы подчеркнуть, что указали другие ответы, измените int на int? и DateTime в DateTime? и попробуйте запустить код снова. Поскольку теперь эти значения могут содержать нули, вы получите то же исключение.

2 голосов
/ 09 октября 2009

Поскольку строка является ссылочным типом, а другие - нет. DateTime и Int должны иметь значения по умолчанию, они не могут быть нулевыми.

Что вам нужно понять, так это то, что компилятор создает переменную для хранения информации. В C # 3.0 вам не нужно явно объявлять его, но он все еще там, поэтому он создает переменную DateTime и переменную int и инициализирует их значениями по умолчанию, чтобы не вызвать ошибку компилятора. Со строкой это не нужно делать (инициализировать значение по умолчанию), потому что это ссылочный тип.

1 голос
/ 09 октября 2009

Начальное значение propString равно нулю. Мы не можем выполнить метод null. Если вы инициализируете propString: propString = "", то вы можете выполнить GetType () без исключения

Код без исключения:

private int      PropInt    { get; set; }
private DateTime PropDate   { get; set; }
private string   propString { get; set; }

propString = ""; // propString != null

WriteLine(PropInt.GetType().ToString());    // Result : System.Int32
WriteLine(PropDate.GetType().ToString());   // Result : System.DateTime
WriteLine(propString.GetType().ToString()); // Result : System.String
...