2014-01-03 4 views
0

Как я могу проверить значение null для типа NULL?Как проверить значение null в типе NULL в C#?

Это мой код

public int? ContractYear 
{ 
    get 
    { 
     if (Dates.FindIndex((Date d) => d.Type == DateType.Issue) == -1) 
      return null; 

     return DateTime.Now.Year - 
       Dates.First((Date d) => d.Type == DateType.Issue).Year.Value; 
    } 
} 

В приведенном выше коде, Date это пользовательский тип со свойством года в моем коде и Dates представляет собой сборник Date возражений. Вот как они определены:

public List<Date> Dates // initialized elsewhere 

public class Date 
{ 
    public DateType Type { get; set; } //DateType is an enum 
    pubic int? Year { get; set; }  
    //additional properties 
} 

В строке .Year.Value я получаю сообщение об ошибке, потому что если год может быть null, то мы не можем получить значение года, и он будет бросать «Nullable объект должен иметь значение»

Теперь, как я могу поместить чек для этой ошибки.

+0

пожалуйста, добавьте его в моем коде .. –

+0

Не добавлять избыточную информацию, как «пожалуйста, не дайте мне downvote». Это только привлечет больше downvotes. Вместо этого попытайтесь выяснить, что не так с вашим вопросом. Это абсолютно неопровержимо, потому что вы не предоставили нам достаточно информации. Мы не смотрим на ваш код, так как в мире мы должны знать, что такое 'Date' и' Dates'?'Date', очевидно, является настраиваемым типом в вашем проекте, а' Dates' выглядит так, будто это может быть коллекция объектов 'Date', но я просто думаю, что – psubsee2003

+0

фактически я новый пользователь в переполнении стека, поэтому могут быть некоторые ошибки .. но это не значит, что у вас нужно проголосовать за него. Из-за этого в будущем я не могу добавить больше вопросов. –

ответ

2

Вы можете проверить значение с помощью yournullableType. HasValue, чтобы проверить, если он HasValue или не

Каждый экземпляр обнуляемого типа имеет два открытых только для чтения свойства: HasValue HasValue имеет тип BOOL. Он имеет значение true, если переменная содержит ненулевое значение. Значение Значение типа того же типа, что и базовый тип. Если HasValue истинно, значение содержит значимое значение. Если HasValue имеет значение false, доступ к значению будет вызывать исключение InvalidOperationException.

Как

int? x = 10; 
if (x.HasValue) 
{ 
    System.Console.WriteLine(x.Value); 
} 
else 
{ 
    System.Console.WriteLine("Undefined"); 
} 
+1

дайте рабочий пример, и вы получите рабочий ответ. – Ehsan

+0

@ShrutiSingh вы шутите? Вы спросили, как проверить нуль, и вам сказали. Работа выполнена. – Gusdor

+0

@Gusdor: не получается, что вы хотите сказать –

0

Обнуляемые типы являются экземплярами System.Nullable структуры. Тип с нулевым значением может представлять правильный диапазон значений для его базового типа значений плюс дополнительное значение null. Например, Nullable, произносится как «Nullable of Int32», может быть присвоено любое значение от -2147483648 до 2147483647 или ему может быть присвоено нулевое значение.

static void Main() 
    { 
     int? num = null; 

     // Is the HasValue property true? 
     if (num.HasValue) 
     { 
      System.Console.WriteLine("num = " + num.Value); 
     } 
     else 
     { 
      System.Console.WriteLine("num = Null"); 
     } 
+0

Пожалуйста, добавьте его в мой код –

2

Чтобы ответить на ваш вопрос, вы получаете сообщение об ошибке, когда Year равна нулю. При работе с нулевыми типами вызов свойства Value, когда значение равно null, выдает исключение.

Чтобы избежать этого, вам необходимо использовать свойство HasValue и проверить его перед звонком Value. Тем не менее, вам нужно решить, как вы хотите справиться с этой конкретной проблемой, в частности, что вы хотите сделать, когда Year is null?

public int? ContractYear 
{ 
    get 
    { 
     var firstIssueDate = Dates.FirstOrDefault((Date d) => d.Type == DateType.Issue); 


     if (firstIssueDate == null) 
     { 
      return null; 
     } 
     else if (firstIssueDate.Year.HasValue) 
     { 
      return DateTime.Now.Year - firstIssueDate .Year.Value; 
     } 
     else 
     { 
      return ??? 
      //this is what you need to decide, 
      // what do you want to return when Year is null? 
     } 
    } 
} 

Есть другие варианты о том, как обращаться со случаем, когда Year имеет нулевое значение, в зависимости от того, что вы хотите, чтобы вернуться, когда это произойдет. Другой распространенный шаблон является условным оператором (?:)

return DateTime.Now.Year - 
     firstIssueDate.Year.HasValue ? firstIssueDate.Year.Value : 0; 
// you can replace the 0 above with whatever 
// value you want to use in lieu of a null Year. 
+0

Я немного пересмотрел код в своем ответе, поэтому вам нужно только один раз выполнить запрос. Это более эффективная практика и теоретически должна выполняться немного быстрее (но если «Даты» не большие, вы, вероятно, не заметите разницу в скорости. – psubsee2003

Смежные вопросы